./decibel-audio-player-1.06/0000755000175000017500000000000011456551414015765 5ustar ingelresingelres./decibel-audio-player-1.06/src/0000755000175000017500000000000011456551413016553 5ustar ingelresingelres./decibel-audio-player-1.06/src/decibel-audio-player.py0000755000175000017500000002365711456551413023125 0ustar ingelresingelres#!/usr/bin/env python # -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import dbus, optparse from tools import consts # Command line optparser = optparse.OptionParser(usage='Usage: %prog [options] [FILE(s)]') optparser.add_option('-p', '--playbin', action='store_true', default=False, help='use the playbin GStreamer component instead of playbin2') optparser.add_option('--no-glossy-cover', action='store_true', default=False, help='disable the gloss effect applied to covers') optparser.add_option('--multiple-instances', action='store_true', default=False, help='start a new instance even if one is already running') (optOptions, optArgs) = optparser.parse_args() # Check whether DAP is already running? if not optOptions.multiple_instances: shouldStop = False dbusSession = None try: dbusSession = dbus.SessionBus() activeServices = dbusSession.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus').ListNames() if consts.dbusService in activeServices: shouldStop = True # Fill the current instance with the given tracks, if any if len(optArgs) != 0: dbus.Interface(dbusSession.get_object(consts.dbusService, '/TrackList'), consts.dbusInterface).SetTracks(optArgs, True) except: pass if dbusSession is not None: dbusSession.close() if shouldStop: import sys sys.exit(1) # Start a new instance import gettext, gobject, gtk, locale from tools import loadGladeFile, log, prefs DEFAULT_VIEW_MODE = consts.VIEW_MODE_FULL DEFAULT_PANED_POS = 300 DEFAULT_WIN_WIDTH = 750 DEFAULT_WIN_HEIGHT = 470 DEFAULT_MAXIMIZED_STATE = False def realStartup(): """ Perform all the initialization stuff which is not mandatory to display the window This function should be called within the GTK main loop, once the window has been displayed """ import atexit, dbus.mainloop.glib, modules, signal def onDelete(win, event): """ Use our own quit sequence, that will itself destroy the window """ window.hide() modules.postQuitMsg() return True def onResize(win, rect): """ Save the new size of the window """ # The first label gets more or less a third of the window's width wTree.get_widget('hbox-status1').set_size_request(rect.width / 3 + 15, -1) # Save size and maximized state if win.window is not None and not win.window.get_state() & gtk.gdk.WINDOW_STATE_MAXIMIZED: prefs.set(__name__, 'win-width', rect.width) prefs.set(__name__, 'win-height', rect.height) if prefs.get(__name__, 'view-mode', DEFAULT_VIEW_MODE)in (consts.VIEW_MODE_FULL, consts.VIEW_MODE_PLAYLIST): prefs.set(__name__, 'full-win-height', rect.height) def onAbout(item): """ Show the about dialog box """ import gui.about gui.about.show(window) def onHelp(item): """ Show help page in the web browser """ import webbrowser webbrowser.open(consts.urlHelp) def onState(win, evt): """ Save the new state of the window """ prefs.set(__name__, 'win-is-maximized', bool(evt.new_window_state & gtk.gdk.WINDOW_STATE_MAXIMIZED)) def atExit(): """ Final function, called just before exiting the Python interpreter """ prefs.save() log.logger.info('Stopped') # D-Bus dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) # Register a few handlers atexit.register(atExit) signal.signal(signal.SIGINT, lambda sig, frame: onDelete(window, None)) signal.signal(signal.SIGTERM, lambda sig, frame: onDelete(window, None)) # GTK handlers window.connect('delete-event', onDelete) window.connect('size-allocate', onResize) window.connect('window-state-event', onState) paned.connect('size-allocate', lambda win, rect: prefs.set(__name__, 'paned-pos', paned.get_position())) wTree.get_widget('menu-mode-mini').connect('activate', onViewMode, consts.VIEW_MODE_MINI) wTree.get_widget('menu-mode-full').connect('activate', onViewMode, consts.VIEW_MODE_FULL) wTree.get_widget('menu-mode-playlist').connect('activate', onViewMode, consts.VIEW_MODE_PLAYLIST) wTree.get_widget('menu-quit').connect('activate', lambda item: onDelete(window, None)) wTree.get_widget('menu-about').connect('activate', onAbout) wTree.get_widget('menu-help').connect('activate', onHelp) wTree.get_widget('menu-preferences').connect('activate', lambda item: modules.showPreferences()) # Now we can start all modules gobject.idle_add(modules.postMsg, consts.MSG_EVT_APP_STARTED) # Immediately show the preferences the first time the application is started if prefs.get(__name__, 'first-time', True): prefs.set(__name__, 'first-time', False) gobject.idle_add(modules.showPreferences) def onViewMode(item, mode): """ Wrapper for setViewMode(): Don't do anything if the mode the same as the current one """ if item.get_active() and mode != prefs.get(__name__, 'view-mode', DEFAULT_VIEW_MODE): setViewMode(mode, True) def setViewMode(mode, resize): """ Change the view mode to the given one """ lastMode = prefs.get(__name__, 'view-mode', DEFAULT_VIEW_MODE) prefs.set(__name__, 'view-mode', mode) (winWidth, winHeight) = window.get_size() if mode == consts.VIEW_MODE_FULL: paned.get_child1().show() wTree.get_widget('statusbar').show() wTree.get_widget('box-btn-tracklist').show() wTree.get_widget('scrolled-tracklist').show() wTree.get_widget('box-trkinfo').show() if resize: if lastMode != consts.VIEW_MODE_FULL: winWidth = winWidth + paned.get_position() if lastMode == consts.VIEW_MODE_MINI: winHeight = prefs.get(__name__, 'full-win-height', DEFAULT_WIN_HEIGHT) window.resize(winWidth, winHeight) return paned.get_child1().hide() if resize and lastMode == consts.VIEW_MODE_FULL: winWidth = winWidth - paned.get_position() window.resize(winWidth, winHeight) if mode == consts.VIEW_MODE_PLAYLIST: wTree.get_widget('statusbar').show() wTree.get_widget('box-btn-tracklist').hide() wTree.get_widget('scrolled-tracklist').show() wTree.get_widget('box-trkinfo').show() if resize and lastMode == consts.VIEW_MODE_MINI: window.resize(winWidth, prefs.get(__name__, 'full-win-height', DEFAULT_WIN_HEIGHT)) return wTree.get_widget('statusbar').hide() wTree.get_widget('box-btn-tracklist').hide() wTree.get_widget('scrolled-tracklist').hide() if mode == consts.VIEW_MODE_MINI: wTree.get_widget('box-trkinfo').show() else: wTree.get_widget('box-trkinfo').hide() if resize: window.resize(winWidth, 1) # --== Entry point ==-- log.logger.info('Started') # Localization locale.setlocale(locale.LC_ALL, '') gettext.textdomain(consts.appNameShort) gettext.bindtextdomain(consts.appNameShort, consts.dirLocale) gtk.glade.textdomain(consts.appNameShort) gtk.glade.bindtextdomain(consts.appNameShort, consts.dirLocale) # Command line prefs.setCmdLine((optOptions, optArgs)) # PyGTK initialization gobject.threads_init() gtk.window_set_default_icon_list(gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon16), gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon24), gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon32), gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon48), gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon64), gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon128)) # Create the GUI wTree = loadGladeFile('MainWindow.glade') paned = wTree.get_widget('pan-main') window = wTree.get_widget('win-main') prefs.setWidgetsTree(wTree) # RGBA support try: colormap = window.get_screen().get_rgba_colormap() if colormap: gtk.widget_set_default_colormap(colormap) except: log.logger.info('No RGBA support (requires PyGTK 2.10+)') # Show all widgets and restore the window size BEFORE hiding some of them when restoring the view mode # Resizing must be done before showing the window to make sure that the WM correctly places the window if prefs.get(__name__, 'win-is-maximized', DEFAULT_MAXIMIZED_STATE): window.maximize() window.resize(prefs.get(__name__, 'win-width', DEFAULT_WIN_WIDTH), prefs.get(__name__, 'win-height', DEFAULT_WIN_HEIGHT)) window.show_all() # Restore last view mode viewMode = prefs.get(__name__, 'view-mode', DEFAULT_VIEW_MODE) if viewMode == consts.VIEW_MODE_FULL: wTree.get_widget('menu-mode-full').set_active(True) else: if viewMode == consts.VIEW_MODE_MINI: wTree.get_widget('menu-mode-mini').set_active(True) else: wTree.get_widget('menu-mode-playlist').set_active(True) setViewMode(viewMode, False) # Restore sizes once more window.resize(prefs.get(__name__, 'win-width', DEFAULT_WIN_WIDTH), prefs.get(__name__, 'win-height', DEFAULT_WIN_HEIGHT)) paned.set_position(prefs.get(__name__, 'paned-pos', DEFAULT_PANED_POS)) # Initialization done, let's continue the show gobject.idle_add(realStartup) gtk.main() ./decibel-audio-player-1.06/src/remote.py0000755000175000017500000000770011456551413020427 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import dbus, os.path, sys ( PLAY, PAUSE, NEXT, PREVIOUS, STOP, SET, ADD, CLEAR, SHUFFLE, VOLUME, ) = range(10) (CMD_ARGS, CMD_HELP, CMD_NAME) = range(3) commands = { 'play': ( '', 'Start playing the current track', PLAY ), 'pause': ( '', 'Pause or continue playing the current track', PAUSE ), 'next': ( '', 'Jump to the next track', NEXT ), 'prev': ( '', 'Jump to the previous track', PREVIOUS), 'stop': ( '', 'Stop playback', STOP ), 'pl-set': ( 'file1 file2...', 'Set the playlist to the given files', SET ), 'pl-add': ( 'file1 file2...', 'Append the given files to the playlist', ADD ), 'pl-clr': ( '', 'Clear the playlist', CLEAR ), 'shuffle': ( '', 'Shuffle the playlist', SHUFFLE ), 'volume': ( 'value (0 -- 100)', 'Set the volume', VOLUME ), } # Check the command line cmdLineOk = False if len(sys.argv) > 1: cmdName = sys.argv[1] if cmdName not in commands: print '%s is not a valid command\n' % cmdName elif len(sys.argv) == 2 and commands[cmdName][CMD_ARGS] != '': print '%s needs some arguments\n' % cmdName elif len(sys.argv) > 2 and commands[cmdName][CMD_ARGS] == '': print '%s does not take any argument\n' % cmdName else: cmdLineOk = True if not cmdLineOk: print 'Usage: %s command [arg1 arg2...]\n' % os.path.basename(sys.argv[0]) print 'Command | Arguments | Description' print '-------------------------------------------------------------------------' for cmd, data in sorted(commands.iteritems()): print '%s| %s| %s' % (cmd.ljust(9), data[CMD_ARGS].ljust(17), data[CMD_HELP]) sys.exit(1) # Connect to D-BUS session = dbus.SessionBus() activeServices = session.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus').ListNames() if 'org.mpris.dap' not in activeServices: print 'Decibel Audio Player is not running, or D-Bus support is not available' sys.exit(2) cmd = commands[cmdName][CMD_NAME] player = dbus.Interface(session.get_object('org.mpris.dap', '/Player'), 'org.freedesktop.MediaPlayer') tracklist = dbus.Interface(session.get_object('org.mpris.dap', '/TrackList'), 'org.freedesktop.MediaPlayer') if cmd == SET: tracklist.SetTracks(sys.argv[2:], True) elif cmd == ADD: print 'Hello' tracklist.AddTracks(sys.argv[2:], False) elif cmd == PLAY: player.Play() elif cmd == NEXT: player.Next() elif cmd == STOP: player.Stop() elif cmd == PAUSE: player.Pause() elif cmd == CLEAR: tracklist.Clear() elif cmd == VOLUME: player.VolumeSet(int(sys.argv[2])) elif cmd == SHUFFLE: tracklist.SetRandom(True) elif cmd == PREVIOUS: player.Prev() ./decibel-audio-player-1.06/src/modules/0000755000175000017500000000000011456551414020224 5ustar ingelresingelres./decibel-audio-player-1.06/src/modules/Twitter.py0000644000175000017500000001144111456551413022240 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gui, modules, traceback from tools import consts, prefs from gettext import gettext as _ from tools.log import logger MOD_INFO = ('Twitter', 'Twitter', _('Update the status of your Twitter account'), [], False, True, consts.MODCAT_INTERNET) DEFAULT_STATUS_MSG = '♫ Listening to {album} by {artist} ♫' class Twitter(modules.ThreadedModule): """ This module updates the status of a Twitter account based on the current track """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, } modules.ThreadedModule.__init__(self, handlers) def getAuthInfo(self): """ Retrieve the login/password of the user """ from gui import authentication auth = authentication.getAuthInfo('Twitter', _('your Twitter account')) if auth is None: self.login, self.passwd = None, None else: self.login, self.passwd = auth # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ self.login = None self.passwd = None self.cfgWindow = None self.lastStatus = '' def onNewTrack(self, track): """ A new track has started """ import base64, urllib, urllib2 status = track.format(prefs.get(__name__, 'status-msg', DEFAULT_STATUS_MSG)) if status == self.lastStatus: return self.gtkExecute(self.getAuthInfo) if self.passwd is None: return authToken = base64.b64encode(self.login + ':' + self.passwd) self.passwd = None self.lastStatus = status request = urllib2.Request('http://twitter.com/statuses/update.xml') request.headers['Authorization'] = 'Basic ' + authToken request.data = urllib.urlencode({'status': status}) try: urllib2.urlopen(request) except: logger.error('[%s] Unable to set Twitter status\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) # --== Configuration ==-- def configure(self, parent): """ Show the configuration window """ if self.cfgWindow is None: self.cfgWindow = gui.window.Window('Twitter.glade', 'vbox1', __name__, _(MOD_INFO[modules.MODINFO_NAME]), 440, 141) # GTK handlers self.cfgWindow.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWindow.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWindow.hide()) self.cfgWindow.getWidget('btn-help').connect('clicked', self.onBtnHelp) if not self.cfgWindow.isVisible(): self.cfgWindow.getWidget('txt-status').set_text(prefs.get(__name__, 'status-msg', DEFAULT_STATUS_MSG)) self.cfgWindow.getWidget('btn-ok').grab_focus() self.cfgWindow.show() def onBtnOk(self, btn): """ Save new preferences """ prefs.set(__name__, 'status-msg', self.cfgWindow.getWidget('txt-status').get_text()) self.cfgWindow.hide() def onBtnHelp(self, btn): """ Display a small help message box """ # Do this import only when we really need it import media helpDlg = gui.help.HelpDlg(_(MOD_INFO[modules.MODINFO_NAME])) helpDlg.addSection(_('Description'), _('This module posts a message to your Twitter account according to what ' 'you are listening to.')) helpDlg.addSection(_('Customizing the Status'), _('You can set the status to any text you want. Before setting it, the module replaces all fields of ' 'the form {field} by their corresponding value. Available fields are:') + '\n\n' + media.track.getFormatSpecialFields(False)) helpDlg.show(self.cfgWindow) ./decibel-audio-player-1.06/src/modules/FileExplorer.py0000644000175000017500000006064411456551413023207 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, media, modules, os, tools from tools import consts, prefs, icons from media import playlist from gettext import gettext as _ from os.path import isdir, isfile from gobject import idle_add, TYPE_STRING, TYPE_INT MOD_INFO = ('File Explorer', _('File Explorer'), _('Browse your file system'), [], True, True, consts.MODCAT_EXPLORER) MOD_L10N = MOD_INFO[modules.MODINFO_L10N] # Default preferences PREFS_DEFAULT_MEDIA_FOLDERS = {_('Home'): consts.dirBaseUsr, _('Root'): '/'} # List of media folders that are used as roots for the file explorer PREFS_DEFAULT_ADD_BY_FILENAME = False # True if files should be added to the playlist by their filename PREFS_DEFAULT_SHOW_HIDDEN_FILES = False # True if hidden files should be shown # The format of a row in the treeview ( ROW_PIXBUF, # Item icon ROW_NAME, # Item name ROW_TYPE, # The type of the item (e.g., directory, file) ROW_FULLPATH # The full path to the item ) = range(4) # The possible types for a node of the tree ( TYPE_DIR, # A directory TYPE_FILE, # A media file TYPE_NONE # A fake item, used to display a '+' in front of a directory when needed ) = range(3) class FileExplorer(modules.Module): """ This explorer lets the user browse the disk from a given root directory (e.g., ~/, /) """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onAppQuit, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_EXPLORER_CHANGED: self.onExplorerChanged, } modules.Module.__init__(self, handlers) def createTree(self): """ Create the tree used to display the file system """ from gui import extTreeview columns = (('', [(gtk.CellRendererPixbuf(), gtk.gdk.Pixbuf), (gtk.CellRendererText(), TYPE_STRING)], True), (None, [(None, TYPE_INT)], False), (None, [(None, TYPE_STRING)], False)) self.tree = extTreeview.ExtTreeView(columns, True) self.scrolled.add(self.tree) self.tree.setDNDSources([consts.DND_TARGETS[consts.DND_DAP_TRACKS]]) self.tree.connect('drag-data-get', self.onDragDataGet) self.tree.connect('key-press-event', self.onKeyPressed) self.tree.connect('exttreeview-button-pressed', self.onMouseButton) self.tree.connect('exttreeview-row-collapsed', self.onRowCollapsed) self.tree.connect('exttreeview-row-expanded', self.onRowExpanded) def getTreeDump(self, path=None): """ Recursively dump the given tree starting at path (None for the root of the tree) """ list = [] for child in self.tree.iterChildren(path): row = self.tree.getRow(child) if self.tree.getNbChildren(child) == 0: grandChildren = None elif self.tree.row_expanded(child): grandChildren = self.getTreeDump(child) else: grandChildren = [] list.append([(row[ROW_NAME], row[ROW_TYPE], row[ROW_FULLPATH]), grandChildren]) return list def restoreTreeDump(self, dump, parent=None): """ Recursively restore the dump under the given parent (None for the root of the tree) """ for item in dump: (name, type, path) = item[0] if type == TYPE_FILE: self.tree.appendRow((icons.mediaFileMenuIcon(), name, TYPE_FILE, path), parent) else: newNode = self.tree.appendRow((icons.dirMenuIcon(), name, TYPE_DIR, path), parent) if item[1] is not None: fakeChild = self.tree.appendRow((icons.dirMenuIcon(), '', TYPE_NONE, ''), newNode) if len(item[1]) != 0: # We must expand the row before adding the real children, but this works only if there is already at least one child self.tree.expandRow(newNode) self.restoreTreeDump(item[1], newNode) self.tree.removeRow(fakeChild) def saveTreeState(self): """ Return a dictionary representing the current state of the tree """ if self.currRoot is not None: self.treeState[self.currRoot] = { 'tree-state': self.getTreeDump(), 'selected-paths': self.tree.getSelectedPaths(), 'vscrollbar-pos': self.scrolled.get_vscrollbar().get_value(), 'hscrollbar-pos': self.scrolled.get_hscrollbar().get_value(), } def sortKey(self, row): """ Key function used to compare two rows of the tree """ return row[ROW_NAME].lower() def setShowHiddenFiles(self, showHiddenFiles): """ Show/hide hidden files """ if showHiddenFiles != self.showHiddenFiles: # Update the configuration window if needed if self.cfgWin is not None and self.cfgWin.isVisible(): self.cfgWin.getWidget('chk-hidden').set_active(showHiddenFiles) self.showHiddenFiles = showHiddenFiles self.refresh() def play(self, replace, path=None): """ Replace/extend the tracklist If 'path' is None, use the current selection """ if path is None: tracks = media.getTracks([row[ROW_FULLPATH] for row in self.tree.getSelectedRows()], self.addByFilename, not self.showHiddenFiles) else: tracks = media.getTracks([self.tree.getRow(path)[ROW_FULLPATH]], self.addByFilename, not self.showHiddenFiles) if replace: modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': tracks, 'playNow': True}) else: modules.postMsg(consts.MSG_CMD_TRACKLIST_ADD, {'tracks': tracks, 'playNow': False}) def renameFolder(self, oldName, newName): """ Rename a folder """ self.folders[newName] = self.folders[oldName] del self.folders[oldName] if oldName in self.treeState: self.treeState[newName] = self.treeState[oldName] del self.treeState[oldName] modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': oldName, 'newExpName': newName}) # --== Tree management ==-- def startLoading(self, row): """ Tell the user that the contents of row is being loaded """ name = self.tree.getItem(row, ROW_NAME) self.tree.setItem(row, ROW_NAME, '%s %s' % (name, _('loading...'))) def stopLoading(self, row): """ Tell the user that the contents of row has been loaded""" name = self.tree.getItem(row, ROW_NAME) index = name.find('<') if index != -1: self.tree.setItem(row, ROW_NAME, name[:index-2]) def getDirContents(self, directory): """ Return a tuple of sorted rows (directories, playlists, mediaFiles) for the given directory """ playlists = [] mediaFiles = [] directories = [] for (file, path) in tools.listDir(directory, self.showHiddenFiles): if isdir(path): directories.append((icons.dirMenuIcon(), tools.htmlEscape(unicode(file, errors='replace')), TYPE_DIR, path)) elif isfile(path): if media.isSupported(file): mediaFiles.append((icons.mediaFileMenuIcon(), tools.htmlEscape(unicode(file, errors='replace')), TYPE_FILE, path)) elif playlist.isSupported(file): playlists.append((icons.mediaFileMenuIcon(), tools.htmlEscape(unicode(file, errors='replace')), TYPE_FILE, path)) playlists.sort(key=self.sortKey) mediaFiles.sort(key=self.sortKey) directories.sort(key=self.sortKey) return (directories, playlists, mediaFiles) def exploreDir(self, parent, directory, fakeChild=None): """ List the contents of the given directory and append it to the tree as a child of parent If fakeChild is not None, remove it when the real contents has been loaded """ directories, playlists, mediaFiles = self.getDirContents(directory) self.tree.appendRows(directories, parent) self.tree.appendRows(playlists, parent) self.tree.appendRows(mediaFiles, parent) if fakeChild is not None: self.tree.removeRow(fakeChild) idle_add(self.updateDirNodes(parent).next) def updateDirNodes(self, parent): """ This generator updates the directory nodes, based on whether they should be expandable """ for child in self.tree.iterChildren(parent): # Only directories need to be updated and since they all come first, we can stop as soon as we find something else if self.tree.getItem(child, ROW_TYPE) != TYPE_DIR: break # Make sure it's readable directory = self.tree.getItem(child, ROW_FULLPATH) hasContent = False if os.access(directory, os.R_OK | os.X_OK): for (file, path) in tools.listDir(directory, self.showHiddenFiles): if isdir(path) or (isfile(path) and (media.isSupported(file) or playlist.isSupported(file))): hasContent = True break # Append/remove children if needed if hasContent and self.tree.getNbChildren(child) == 0: self.tree.appendRow((icons.dirMenuIcon(), '', TYPE_NONE, ''), child) elif not hasContent and self.tree.getNbChildren(child) > 0: self.tree.removeAllChildren(child) yield True if parent is not None: self.stopLoading(parent) yield False def refresh(self, treePath=None): """ Refresh the tree, starting from treePath """ if treePath is None: directory = self.folders[self.currRoot] else: directory = self.tree.getItem(treePath, ROW_FULLPATH) directories, playlists, mediaFiles = self.getDirContents(directory) disk = directories + playlists + mediaFiles diskIndex = 0 childIndex = 0 childLeftIntentionally = False while diskIndex < len(disk): rowPath = self.tree.getChild(treePath, childIndex) # Did we reach the end of the tree? if rowPath is None: break file = disk[diskIndex] cmpResult = cmp(self.sortKey(self.tree.getRow(rowPath)), self.sortKey(file)) if cmpResult < 0: # We can't remove the only child left, to prevent the node from being closed automatically if self.tree.getNbChildren(treePath) == 1: childLeftIntentionally = True break self.tree.removeRow(rowPath) else: if cmpResult > 0: self.tree.insertRowBefore(file, treePath, rowPath) diskIndex += 1 childIndex += 1 # If there are tree rows left, all the corresponding files are no longer there if not childLeftIntentionally: while childIndex < self.tree.getNbChildren(treePath): self.tree.removeRow(self.tree.getChild(treePath, childIndex)) # Disk files left? while diskIndex < len(disk): self.tree.appendRow(disk[diskIndex], treePath) diskIndex += 1 # Deprecated child left? (must be done after the addition of left disk files) if childLeftIntentionally: self.tree.removeRow(self.tree.getChild(treePath, 0)) # Update nodes' appearance if len(directories) != 0: idle_add(self.updateDirNodes(treePath).next) # Recursively refresh expanded rows for child in self.tree.iterChildren(treePath): if self.tree.row_expanded(child): idle_add(self.refresh, child) # --== GTK handlers ==-- def onMouseButton(self, tree, event, path): """ A mouse button has been pressed """ if event.button == 3: self.onShowPopupMenu(tree, event.button, event.time, path) elif path is not None: if event.button == 2: self.play(False, path) elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: if tree.getItem(path, ROW_PIXBUF) != icons.dirMenuIcon(): self.play(True) elif tree.row_expanded(path): tree.collapse_row(path) else: tree.expand_row(path, False) def onShowPopupMenu(self, tree, button, time, path): """ Show a popup menu """ popup = gtk.Menu() # Play selection play = gtk.ImageMenuItem(gtk.STOCK_MEDIA_PLAY) popup.append(play) if path is None: play.set_sensitive(False) else: play.connect('activate', lambda widget: self.play(True)) popup.append(gtk.SeparatorMenuItem()) # Collapse all nodes collapse = gtk.ImageMenuItem(_('Collapse all')) collapse.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU)) collapse.connect('activate', lambda widget: tree.collapse_all()) popup.append(collapse) # Refresh the view refresh = gtk.ImageMenuItem(gtk.STOCK_REFRESH) refresh.connect('activate', lambda widget: self.refresh()) popup.append(refresh) popup.append(gtk.SeparatorMenuItem()) # Show hidden files hidden = gtk.CheckMenuItem(_('Show hidden files')) hidden.set_active(self.showHiddenFiles) hidden.connect('toggled', lambda item: self.setShowHiddenFiles(item.get_active())) popup.append(hidden) popup.show_all() popup.popup(None, None, None, button, time) def onKeyPressed(self, tree, event): """ A key has been pressed """ keyname = gtk.gdk.keyval_name(event.keyval) if keyname == 'F5': self.refresh() elif keyname == 'plus': tree.expandRows() elif keyname == 'Left': tree.collapseRows() elif keyname == 'Right': tree.expandRows() elif keyname == 'minus': tree.collapseRows() elif keyname == 'space': tree.switchRows() elif keyname == 'Return': self.play(True) def onRowExpanded(self, tree, path): """ Replace the fake child by the real children """ self.startLoading(path) idle_add(self.exploreDir, path, tree.getItem(path, ROW_FULLPATH), tree.getChild(path, 0)) def onRowCollapsed(self, tree, path): """ Replace all children by a fake child """ tree.removeAllChildren(path) tree.appendRow((icons.dirMenuIcon(), '', TYPE_NONE, ''), path) def onDragDataGet(self, tree, context, selection, info, time): """ Provide information about the data being dragged """ allTracks = media.getTracks([row[ROW_FULLPATH] for row in self.tree.getSelectedRows()], self.addByFilename, not self.showHiddenFiles) selection.set(consts.DND_TARGETS[consts.DND_DAP_TRACKS][0], 8, '\n'.join([track.serialize() for track in allTracks])) # --== Message handlers ==-- def onAppStarted(self): """ The module has been loaded """ self.tree = None self.cfgWin = None self.folders = prefs.get(__name__, 'media-folders', PREFS_DEFAULT_MEDIA_FOLDERS) self.scrolled = gtk.ScrolledWindow() self.currRoot = None self.treeState = prefs.get(__name__, 'saved-states', {}) self.addByFilename = prefs.get(__name__, 'add-by-filename', PREFS_DEFAULT_ADD_BY_FILENAME) self.showHiddenFiles = prefs.get(__name__, 'show-hidden-files', PREFS_DEFAULT_SHOW_HIDDEN_FILES) self.scrolled.set_shadow_type(gtk.SHADOW_IN) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.show() for name in self.folders: modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': name, 'icon': icons.dirMenuIcon(), 'widget': self.scrolled}) def onAppQuit(self): """ The module is going to be unloaded """ self.saveTreeState() prefs.set(__name__, 'saved-states', self.treeState) prefs.set(__name__, 'media-folders', self.folders) prefs.set(__name__, 'add-by-filename', self.addByFilename) prefs.set(__name__, 'show-hidden-files', self.showHiddenFiles) def onExplorerChanged(self, modName, expName): """ A new explorer has been selected """ if modName == MOD_L10N and self.currRoot != expName: # Create the tree if needed if self.tree is None: self.createTree() # Save the state of the current root if self.currRoot is not None: self.saveTreeState() self.tree.clear() self.currRoot = expName # Restore the state of the new root if expName in self.treeState: self.tree.handler_block_by_func(self.onRowExpanded) self.restoreTreeDump(self.treeState[expName]['tree-state']) self.tree.handler_unblock_by_func(self.onRowExpanded) idle_add(self.scrolled.get_vscrollbar().set_value, self.treeState[expName]['vscrollbar-pos']) idle_add(self.scrolled.get_hscrollbar().set_value, self.treeState[expName]['hscrollbar-pos']) idle_add(self.tree.selectPaths, self.treeState[expName]['selected-paths']) idle_add(self.refresh) else: self.exploreDir(None, self.folders[self.currRoot]) if len(self.tree) != 0: self.tree.scroll_to_cell(0) # --== Configuration ==-- def configure(self, parent): """ Show the configuration dialog """ if self.cfgWin is None: from gui import extListview, window self.cfgWin = window.Window('FileExplorer.glade', 'vbox1', __name__, MOD_L10N, 370, 400) # Create the list of folders txtRdr = gtk.CellRendererText() pixRdr = gtk.CellRendererPixbuf() columns = ((None, [(txtRdr, TYPE_STRING)], 0, False, False), ('', [(pixRdr, gtk.gdk.Pixbuf), (txtRdr, TYPE_STRING)], 2, False, True)) self.cfgList = extListview.ExtListView(columns, sortable=False, useMarkup=True, canShowHideColumns=False) self.cfgList.set_headers_visible(False) self.cfgWin.getWidget('scrolledwindow1').add(self.cfgList) # Connect handlers self.cfgList.connect('key-press-event', self.onCfgKeyPressed) self.cfgList.get_selection().connect('changed', self.onCfgSelectionChanged) self.cfgWin.getWidget('btn-add').connect('clicked', self.onAddFolder) self.cfgWin.getWidget('btn-remove').connect('clicked', lambda btn: self.onRemoveSelectedFolder(self.cfgList)) self.cfgWin.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWin.getWidget('btn-rename').connect('clicked', self.onRenameFolder) self.cfgWin.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWin.hide()) self.cfgWin.getWidget('btn-help').connect('clicked', self.onHelp) if not self.cfgWin.isVisible(): self.populateFolderList() self.cfgWin.getWidget('chk-hidden').set_active(self.showHiddenFiles) self.cfgWin.getWidget('chk-add-by-filename').set_active(self.addByFilename) self.cfgWin.getWidget('btn-ok').grab_focus() self.cfgWin.show() def populateFolderList(self): """ Populate the list of known folders """ self.cfgList.replaceContent([(name, icons.dirBtnIcon(), '%s\n%s' % (tools.htmlEscape(name), tools.htmlEscape(path))) for name, path in sorted(self.folders.iteritems())]) def onAddFolder(self, btn): """ Let the user add a new folder to the list """ from gui import selectPath result = selectPath.SelectPath(MOD_L10N, self.cfgWin, self.folders.keys()).run() if result is not None: name, path = result self.folders[name] = path self.populateFolderList() modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': name, 'icon': icons.dirMenuIcon(), 'widget': self.scrolled}) def onRemoveSelectedFolder(self, list): """ Remove the selected media folder """ import gui if list.getSelectedRowsCount() == 1: remark = _('You will be able to add this root folder again later on if you wish so.') question = _('Remove the selected entry?') else: remark = _('You will be able to add these root folders again later on if you wish so.') question = _('Remove all selected entries?') if gui.questionMsgBox(self.cfgWin, question, '%s %s' % (_('Your media files will not be deleted.'), remark)) == gtk.RESPONSE_YES: for row in self.cfgList.getSelectedRows(): name = row[0] modules.postMsg(consts.MSG_CMD_EXPLORER_REMOVE, {'modName': MOD_L10N, 'expName': name}) del self.folders[name] # Remove the tree, if any, from the scrolled window if self.currRoot == name: self.currRoot = None # Remove the saved state of the tree, if any if name in self.treeState: del self.treeState[name] self.cfgList.removeSelectedRows() def onRenameFolder(self, btn): """ Let the user rename a folder """ from gui import selectPath name = self.cfgList.getSelectedRows()[0][0] forbidden = [rootName for rootName in self.folders if rootName != name] pathSelector = selectPath.SelectPath(MOD_L10N, self.cfgWin, forbidden) pathSelector.setPathSelectionEnabled(False) result = pathSelector.run(name, self.folders[name]) if result is not None and result[0] != name: self.renameFolder(name, result[0]) self.populateFolderList() def onCfgKeyPressed(self, list, event): """ Remove the selection if possible """ if gtk.gdk.keyval_name(event.keyval) == 'Delete': self.onRemoveSelectedFolder(list) def onCfgSelectionChanged(self, selection): """ The selection has changed """ self.cfgWin.getWidget('btn-remove').set_sensitive(selection.count_selected_rows() != 0) self.cfgWin.getWidget('btn-rename').set_sensitive(selection.count_selected_rows() == 1) def onBtnOk(self, btn): """ The user has clicked on the OK button """ self.cfgWin.hide() self.setShowHiddenFiles(self.cfgWin.getWidget('chk-hidden').get_active()) self.addByFilename = self.cfgWin.getWidget('chk-add-by-filename').get_active() def onHelp(self, btn): """ Display a small help message box """ import gui helpDlg = gui.help.HelpDlg(MOD_L10N) helpDlg.addSection(_('Description'), _('This module allows you to browse the files on your drives.')) helpDlg.addSection(_('Usage'), _('At least one root folder must be added to browse your files. This folder then becomes the root of the ' 'file explorer tree in the main window.')) helpDlg.show(self.cfgWin) ./decibel-audio-player-1.06/src/modules/CtrlPanel.py0000644000175000017500000001643011456551413022465 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, modules from tools import consts, prefs, sec2str from gettext import gettext as _ MOD_INFO = ('Control Panel', 'Control Panel', '', [], True, False, consts.MODCAT_NONE) PREFS_DEFAULT_VOLUME = 0.65 class CtrlPanel(modules.Module): """ This module manages the control panel with the buttons and the slider """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_APP_QUIT: self.onAppQuit, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_TRACK_MOVED: self.onCurrentTrackMoved, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_NEW_TRACKLIST: self.onNewTracklist, consts.MSG_EVT_VOLUME_CHANGED: self.onVolumeChanged, consts.MSG_EVT_TRACK_POSITION: self.onNewTrackPosition, } modules.Module.__init__(self, handlers) # --== Message handler ==-- def onAppStarted(self): """ Real initialization function, called when this module has been loaded """ self.currTrackLength = 0 self.sclBeingDragged = False # Widgets wTree = prefs.getWidgetsTree() self.btnStop = wTree.get_widget('btn-stop') self.btnPlay = wTree.get_widget('btn-play') self.btnNext = wTree.get_widget('btn-next') self.btnPrev = wTree.get_widget('btn-previous') self.sclSeek = wTree.get_widget('scl-position') self.btnVolume = wTree.get_widget('btn-volume') self.lblElapsed = wTree.get_widget('lbl-elapsedTime') self.lblRemaining = wTree.get_widget('lbl-remainingTime') # Restore the volume volume = prefs.get(__name__, 'volume', PREFS_DEFAULT_VOLUME) self.btnVolume.set_value(volume) modules.postMsg(consts.MSG_CMD_SET_VOLUME, {'value': volume}) # GTK handlers self.btnStop.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_STOP)) self.btnNext.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_NEXT)) self.btnPrev.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_PREVIOUS)) self.btnPlay.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE)) self.sclSeek.connect('change-value', self.onSeekChangingValue) self.sclSeek.connect('value-changed', self.onSeekValueChanged) self.btnVolume.connect('value-changed', self.onVolumeValueChanged) def onAppQuit(self): """ The application is about to terminate """ prefs.set(__name__, 'volume', self.btnVolume.get_value()) def onNewTrack(self, track): """ A new track is being played """ self.btnStop.set_sensitive(True) self.btnPlay.set_sensitive(True) self.btnPlay.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)) self.btnPlay.set_tooltip_text(_('Pause the current track')) self.currTrackLength = track.getLength() self.sclSeek.show() self.lblElapsed.show() self.lblRemaining.show() self.onNewTrackPosition(0) # Must be done last if self.currTrackLength != 0: self.sclSeek.set_range(0, self.currTrackLength) def onStopped(self): """ The playback has been stopped """ self.btnStop.set_sensitive(False) self.btnNext.set_sensitive(False) self.btnPrev.set_sensitive(False) self.btnPlay.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)) self.btnPlay.set_tooltip_text(_('Play the first selected track of the playlist')) self.sclSeek.hide() self.lblElapsed.hide() self.lblRemaining.hide() def onNewTrackPosition(self, seconds): """ The track position has changed """ if not self.sclBeingDragged: self.lblElapsed.set_label(sec2str(seconds)) if seconds >= self.currTrackLength: seconds = self.currTrackLength self.lblRemaining.set_label(sec2str(self.currTrackLength - seconds)) # Make sure the handler will not be called self.sclSeek.handler_block_by_func(self.onSeekValueChanged) self.sclSeek.set_value(seconds) self.sclSeek.handler_unblock_by_func(self.onSeekValueChanged) def onVolumeChanged(self, value): """ The volume has been changed """ self.btnVolume.handler_block_by_func(self.onVolumeValueChanged) self.btnVolume.set_value(value) self.btnVolume.handler_unblock_by_func(self.onVolumeValueChanged) def onCurrentTrackMoved(self, hasPrevious, hasNext): """ Update previous and next buttons """ self.btnNext.set_sensitive(hasNext) self.btnPrev.set_sensitive(hasPrevious) def onPaused(self): """ The playback has been paused """ self.btnPlay.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_BUTTON)) self.btnPlay.set_tooltip_text(_('Continue playing the current track')) def onUnpaused(self): """ The playback has been unpaused """ self.btnPlay.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON)) self.btnPlay.set_tooltip_text(_('Pause the current track')) def onNewTracklist(self, tracks, playtime): """ A new tracklist has been set """ self.btnPlay.set_sensitive(playtime != 0) # --== GTK handlers ==-- def onSeekValueChanged(self, range): """ The user has moved the seek slider """ modules.postMsg(consts.MSG_CMD_SEEK, {'seconds': int(range.get_value())}) self.sclBeingDragged = False def onSeekChangingValue(self, range, scroll, value): """ The user is moving the seek slider """ self.sclBeingDragged = True if value >= self.currTrackLength: value = self.currTrackLength else: value = int(value) self.lblElapsed.set_label(sec2str(value)) self.lblRemaining.set_label(sec2str(self.currTrackLength - value)) def onVolumeValueChanged(self, button, value): """ The user has moved the volume slider """ modules.postMsg(consts.MSG_CMD_SET_VOLUME, {'value': value}) ./decibel-audio-player-1.06/src/modules/__init__.py0000644000175000017500000003210711456551413022337 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, gui, gui.preferences, os, sys, threading, traceback from tools import consts, log, prefs from gettext import gettext as _ # Information exported by a module ( MODINFO_NAME, # Name of the module, must be unique MODINFO_L10N, # Name translated into the current locale MODINFO_DESC, # Description of the module, translated into the current locale MODINFO_DEPS, # A list of special Python dependencies (e.g., pynotify) MODINFO_MANDATORY, # True if the module cannot be disabled MODINFO_CONFIGURABLE, # True if the module can be configured MODINFO_CATEGORY, # Category the module belongs to ) = range(7) # Values associated with a module ( MOD_PMODULE, # The actual Python module object MOD_CLASSNAME, # The classname of the module MOD_INSTANCE, # Instance, None if not currently enabled MOD_INFO # A tuple exported by the module, see above definition ) = range(4) class LoadException(Exception): """ Raised when a module could not be loaded """ def __init__(self, errMsg): """ Constructor """ self.errMsg = errMsg def __str__(self): """ String representation """ return self.errMsg def __checkDeps(deps): """ Given a list of Python modules, return a list of the modules that are unavailable """ unmetDeps = [] for module in deps: try: __import__(module) except: unmetDeps.append(module) return unmetDeps def load(name): """ Load the given module, may raise LoadException """ mModulesLock.acquire() module = mModules[name] mModulesLock.release() # Check dependencies unmetDeps = __checkDeps(module[MOD_INFO][MODINFO_DEPS]) if len(unmetDeps) != 0: errMsg = _('The following Python modules are not available:') errMsg += '\n * ' errMsg += '\n * '.join(unmetDeps) errMsg += '\n\n' errMsg += _('You must install them if you want to enable this module.') raise LoadException, errMsg # Instantiate the module try: module[MOD_INSTANCE] = getattr(module[MOD_PMODULE], module[MOD_CLASSNAME])() module[MOD_INSTANCE].start() mHandlersLock.acquire() if module[MOD_INSTANCE] in mHandlers[consts.MSG_EVT_MOD_LOADED]: module[MOD_INSTANCE].postMsg(consts.MSG_EVT_MOD_LOADED) mHandlersLock.release() log.logger.info('Module loaded: %s' % module[MOD_CLASSNAME]) mEnabledModules.append(name) prefs.set(__name__, 'enabled_modules', mEnabledModules) except: raise LoadException, traceback.format_exc() def unload(name): """ Unload the given module """ mModulesLock.acquire() module = mModules[name] instance = module[MOD_INSTANCE] module[MOD_INSTANCE] = None mModulesLock.release() if instance is not None: mHandlersLock.acquire() instance.postMsg(consts.MSG_EVT_MOD_UNLOADED) for handlers in [handler for handler in mHandlers.itervalues() if instance in handler]: handlers.remove(instance) mHandlersLock.release() mEnabledModules.remove(name) log.logger.info('Module unloaded: %s' % module[MOD_CLASSNAME]) prefs.set(__name__, 'enabled_modules', mEnabledModules) def getModules(): """ Return a copy of all known modules """ mModulesLock.acquire() copy = mModules.items() mModulesLock.release() return copy def register(module, msgList): """ Register the given module for all messages in the given list/tuple """ mHandlersLock.acquire() for msg in msgList: mHandlers[msg].add(module) mHandlersLock.release() def showPreferences(): """ Show the preferences dialog box """ gobject.idle_add(gui.preferences.show) def __postMsg(msg, params={}): """ This is the 'real' postMsg function, which must be executed in the GTK main loop """ mHandlersLock.acquire() for module in mHandlers[msg]: module.postMsg(msg, params) mHandlersLock.release() def postMsg(msg, params={}): """ Post a message to the queue of modules that registered for this type of message """ # We need to ensure that posting messages will be done by the GTK main loop # Otherwise, the code of threaded modules could be executed in the caller's thread, which could cause problems when calling GTK functions gobject.idle_add(__postMsg, msg, params) def __postQuitMsg(): """ This is the 'real' postQuitMsg function, which must be executed in the GTK main loop """ __postMsg(consts.MSG_EVT_APP_QUIT) for modData in mModules.itervalues(): if modData[MOD_INSTANCE] is not None: modData[MOD_INSTANCE].join() # Don't exit the application right now, let modules do their job before gobject.idle_add(gtk.main_quit) def postQuitMsg(): """ Post a MSG_EVT_APP_QUIT in each module's queue and exit the application """ # As with postMsg(), we need to ensure that the code will be executed by the GTK main loop gobject.idle_add(__postQuitMsg) mMenuItems = {} mSeparator = None mAccelGroup = None def __addMenuItem(label, callback, accelerator): """ This is the 'real' addMenuItem function, which must be executed in the GTK main loop """ global mAccelGroup, mSeparator menu = prefs.getWidgetsTree().get_widget('menu-edit') # Remove all menu items if len(mMenuItems) != 0: menu.remove(mSeparator) for menuitem in mMenuItems.itervalues(): menu.remove(menuitem) # Create a new menu item for the module menuitem = gtk.MenuItem(label) menuitem.connect('activate', callback) menuitem.show() mMenuItems[label] = menuitem # Add an accelerator if needed if accelerator is not None: if mAccelGroup is None: mAccelGroup = gtk.AccelGroup() prefs.getWidgetsTree().get_widget('win-main').add_accel_group(mAccelGroup) key, mod = gtk.accelerator_parse(accelerator) menuitem.add_accelerator('activate', mAccelGroup, key, mod, gtk.ACCEL_VISIBLE) # Create the separator? if mSeparator is None: mSeparator = gtk.SeparatorMenuItem() mSeparator.show() # Re-add items alphabetically, including the new one menu.insert(mSeparator, 0) for item in sorted(mMenuItems.items(), key = lambda item: item[0], reverse = True): menu.insert(item[1], 0) def addMenuItem(label, callback, accelerator=None): """ Add a menu item to the 'modules' menu """ gobject.idle_add(__addMenuItem, label, callback, accelerator) def __delMenuItem(label): """ This is the 'real' delMenuItem function, which must be executed in the GTK main loop """ # Make sure the menu item is there if label not in mMenuItems: return menu = prefs.getWidgetsTree().get_widget('menu-edit') # Remove all current menu items menu.remove(mSeparator) for menuitem in mMenuItems.itervalues(): menu.remove(menuitem) # Delete the given menu item del mMenuItems[label] # Re-add items if needed if len(mMenuItems) != 0: menu.insert(mSeparator, 0) for item in sorted(mMenuItems.items(), key = lambda item: item[0], reverse = True): menu.insert(item[1], 0) def delMenuItem(label): """ Delete a menu item from the 'modules' menu """ gobject.idle_add(__delMenuItem, label) # --== Base classes for modules ==-- class ModuleBase: """ This class makes sure that all modules have some mandatory functions """ def join(self): pass def start(self): pass def configure(self, parent): pass def handleMsg(self, msg, params): pass def restartRequired(self): gobject.idle_add(gui.infoMsgBox, None, _('Restart required'), _('You must restart the application for this modification to take effect.')) class Module(ModuleBase): """ This is the base class for non-threaded modules """ def __init__(self, handlers): self.handlers = handlers register(self, handlers.keys()) def postMsg(self, msg, params={}): gobject.idle_add(self.__dispatch, msg, params) def __dispatch(self, msg, params): self.handlers[msg](**params) class ThreadedModule(threading.Thread, ModuleBase): """ This is the base class for threaded modules """ def __init__(self, handlers): """ Constructor """ import Queue # Attributes self.queue = Queue.Queue(0) # List of queued messages self.gtkResult = None # Value returned by the function executed in the GTK loop self.gtkSemaphore = threading.Semaphore(0) # Used to execute some code in the GTK loop # Initialization threading.Thread.__init__(self) # Add QUIT and UNLOADED messages if needed # These messages are required to exit the thread's loop if consts.MSG_EVT_APP_QUIT not in handlers: handlers[consts.MSG_EVT_APP_QUIT] = lambda: None if consts.MSG_EVT_MOD_UNLOADED not in handlers: handlers[consts.MSG_EVT_MOD_UNLOADED] = lambda: None self.handlers = handlers register(self, handlers.keys()) def __gtkExecute(self, func): """ Private function, must be executed in the GTK main loop """ self.gtkResult = func() self.gtkSemaphore.release() def gtkExecute(self, func): """ Execute func in the GTK main loop, and block the execution of the thread until done """ gobject.idle_add(self.__gtkExecute, func) self.gtkSemaphore.acquire() return self.gtkResult def threadExecute(self, func, *args): """ Schedule func(*args) to be called by the thread This is used to avoid func to be executed in the GTK main loop """ self.postMsg(consts.MSG_CMD_THREAD_EXECUTE, (func, args)) def postMsg(self, msg, params={}): """ Enqueue a message in this threads's message queue """ self.queue.put((msg, params)) def run(self): """ Wait for messages and handle them """ msg = None while msg != consts.MSG_EVT_APP_QUIT and msg != consts.MSG_EVT_MOD_UNLOADED: (msg, params) = self.queue.get(True) if msg == consts.MSG_CMD_THREAD_EXECUTE: (func, args) = params func(*args) else: self.handlers[msg](**params) # --== Entry point ==-- mModDir = os.path.dirname(__file__) # Where modules are located mModules = {} # All known modules associated to an 'active' boolean mHandlers = dict([(msg, set()) for msg in xrange(consts.MSG_END_VALUE)]) # For each message, store the set of registered modules mModulesLock = threading.Lock() # Protects the modules list from concurrent access mHandlersLock = threading.Lock() # Protects the handlers list from concurrent access mEnabledModules = prefs.get(__name__, 'enabled_modules', []) # List of modules currently enabled # Find modules, instantiate those that are mandatory or that have been previously enabled by the user sys.path.append(mModDir) for file in [os.path.splitext(file)[0] for file in os.listdir(mModDir) if file.endswith('.py') and file != '__init__.py']: try: pModule = __import__(file) modInfo = getattr(pModule, 'MOD_INFO') # Should it be instanciated? instance = None if modInfo[MODINFO_MANDATORY] or modInfo[MODINFO_NAME] in mEnabledModules: if len(__checkDeps(modInfo[MODINFO_DEPS])) == 0: instance = getattr(pModule, file)() instance.start() log.logger.info('Module loaded: %s' % file) else: log.logger.error('Unable to load module %s because of missing dependencies' % file) # Add it to the dictionary mModules[modInfo[MODINFO_NAME]] = [pModule, file, instance, modInfo] except: log.logger.error('Unable to load module %s\n\n%s' % (file, traceback.format_exc())) # Remove enabled modules that are no longer available mEnabledModules[:] = [module for module in mEnabledModules if module in mModules] prefs.set(__name__, 'enabled_modules', mEnabledModules) ./decibel-audio-player-1.06/src/modules/TrackPanel.py0000644000175000017500000001452211456551413022625 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, modules, os.path, tools from tools import consts from gettext import gettext as _ MOD_INFO = ('Track Panel', 'Track Panel', '', [], True, False, consts.MODCAT_NONE) class TrackPanel(modules.Module): """ This module manages the panel showing information on the current track. This includes the thumbnail of the current cover, if the user has enabled the 'Covers' module. """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_CMD_SET_COVER: self.onSetCover, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_APP_STARTED: self.onAppStarted, } modules.Module.__init__(self, handlers) def __setTitle(self, title, length=None): """ Change the title of the current track """ title = tools.htmlEscape(title) if length is None: self.txtTitle.set_markup('%s' % title) else: self.txtTitle.set_markup('%s [%s]' % (title, tools.sec2str(length))) def __setImage(self, imgPath): """ Change the current image to imgPath. Use the application's icon if imgPath is None. """ if imgPath is None: self.img.set_from_file(os.path.join(tools.consts.dirPix, 'cover-none.png')) else: self.img.set_from_file(imgPath) def __showCover(self, x, y): """ Display a popup window showing the full size cover. The window closes automatically when clicked or when the mouse leaves it. """ # Don't do anything if there's already a cover if self.coverWindow is not None: return frame = gtk.Frame() image = gtk.Image() evtBox = gtk.EventBox() self.coverWindow = gtk.Window(gtk.WINDOW_POPUP) # Construct the window image.set_from_file(self.currCoverPath) evtBox.add(image) frame.set_shadow_type(gtk.SHADOW_IN) frame.add(evtBox) self.coverWindow.add(frame) # Center the window around (x, y) pixbuf = image.get_pixbuf() width = pixbuf.get_width() height = pixbuf.get_height() self.coverWindow.move(int(x - width/2), int(y - height/2)) # Destroy the window when clicked and when the mouse leaves it evtBox.connect('button-press-event', self.onCoverWindowDestroy) evtBox.connect('leave-notify-event', self.onCoverWindowDestroy) self.coverWindow.show_all() # --== Message handlers ==-- def onAppStarted(self): """ Real initialization function, called when this module has been loaded """ # Widgets wTree = tools.prefs.getWidgetsTree() evtBox = wTree.get_widget('evtbox-cover') self.img = wTree.get_widget('img-cover') self.txtMisc = wTree.get_widget('lbl-trkMisc') self.txtTitle = wTree.get_widget('lbl-trkTitle') self.imgFrame = wTree.get_widget('frm-cover') self.currTrack = None self.coverWindow = None self.coverTimerId = None self.currCoverPath = None self.lastMousePosition = (0, 0) # GTK handlers evtBox.connect('leave-notify-event', self.onImgMouseLeave) evtBox.connect('enter-notify-event', self.onImgMouseEnter) def onNewTrack(self, track): """ A new track is being played """ self.currTrack = track self.__setTitle(track.getTitle(), track.getLength()) self.txtMisc.set_text(_('by %(artist)s\nfrom %(album)s' % {'artist': track.getArtist(), 'album': track.getExtendedAlbum()})) def onStopped(self): """ Playback has been stopped """ self.currTrack = None self.currCoverPath = None self.__setImage(None) self.__setTitle(consts.appName) self.txtMisc.set_text('...And Music For All\n') def onSetCover(self, track, pathThumbnail, pathFullSize): """ Set the cover that is currently displayed """ # Must check if currTrack is not None, because '==' calls the cmp() method and this fails on None if self.currTrack is not None and track == self.currTrack: self.currCoverPath = pathFullSize self.__setImage(pathThumbnail) # --== GTK handlers ==-- def onImgMouseEnter(self, evtBox, event): """ The mouse is over the event box """ if self.currCoverPath is not None and (event.x_root, event.y_root) != self.lastMousePosition: self.coverTimerId = gobject.timeout_add(600, self.onCoverTimerTimedOut) def onImgMouseLeave(self, evtBox, event): """ The mouse left the event box """ self.lastMousePosition = (0, 0) if self.coverTimerId is not None: gobject.source_remove(self.coverTimerId) self.coverTimerId = None def onCoverTimerTimedOut(self): """ The mouse has been over the cover thumbnail during enough time """ if self.currCoverPath is not None: self.__showCover(*tools.getCursorPosition()) return False def onCoverWindowDestroy(self, widget, event): """ Destroy the cover window """ if self.coverWindow is not None: self.coverWindow.destroy() self.coverWindow = None self.lastMousePosition = tools.getCursorPosition() ./decibel-audio-player-1.06/src/modules/Covers.py0000644000175000017500000004770511456551413022053 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules, os, tools, traceback from tools import consts, prefs from gettext import gettext as _ from tools.log import logger # Module information MOD_INFO = ('Covers', _('Covers'), _('Show album covers'), [], False, True, consts.MODCAT_DECIBEL) MOD_NAME = MOD_INFO[modules.MODINFO_NAME] AS_API_KEY = 'fd8dd98d26bb3f288f3e626502f9add6' # Ingelrest François' Audioscrobbler API key AS_TAG_START = '' # The text that is right before the URL to the cover AS_TAG_END = '' # The text that is right after the URL to the cover # It seems that a non standard 'user-agent' header may cause problem, so let's cheat USER_AGENT = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Firefox/3.0.1' # We store both the paths to the thumbnail and to the full size image ( CVR_THUMB, CVR_FULL, ) = range(2) # Width/height of PIL images ( PIL_WIDTH, PIL_HEIGHT, ) = range(2) # Constants for thumbnails THUMBNAIL_WIDTH = 100 # Width allocated to thumbnails in the model THUMBNAIL_HEIGHT = 100 # Height allocated to thumbnails in the model THUMBNAIL_OFFSETX = 11 # X-offset to render the thumbnail in the model THUMBNAIL_OFFSETY = 3 # Y-offset to render the thumbnail in the model # Constants for full size covers FULLSIZE_WIDTH = 300 FULLSIZE_HEIGHT = 300 # File formats we can read ACCEPTED_FILE_FORMATS = {'.jpg': None, '.jpeg': None, '.png': None, '.gif': None} # Default preferences PREFS_DFT_DOWNLOAD_COVERS = False PREFS_DFT_PREFER_USER_COVERS = True PREFS_DFT_USER_COVER_FILENAMES = ['cover', 'art', 'front', '*'] PREFS_DFT_SEARCH_IN_PARENT_DIRS = False # Images for thumbnails THUMBNAIL_GLOSS = os.path.join(consts.dirPix, 'cover-gloss.png') THUMBNAIL_MODEL = os.path.join(consts.dirPix, 'cover-model.png') class Covers(modules.ThreadedModule): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onModUnloaded, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, } modules.ThreadedModule.__init__(self, handlers) def __resizeWithRatio(self, width, height, maxWidth, maxHeight): """ Fit (width x height) into (maxWidth x maxHeight) while preserving the original ratio Return a tuple (newWidth, newheight) """ diffWidth = width - maxWidth diffHeight = height - maxHeight if diffWidth <= 0 and diffHeight <= 0: newWidth = width newHeight = height elif diffHeight > diffWidth: newHeight = maxHeight newWidth = width * maxHeight / height else: newWidth = maxWidth newHeight = height * maxWidth / width return (newWidth, newHeight) def generateFullSizeCover(self, inFile, outFile, format): """ Resize inFile if needed, and write it to outFile (outFile and inFile may be equal) """ import Image try: # Open the image cover = Image.open(inFile) # Fit the image into FULLSIZE_WIDTH x FULLSIZE_HEIGHT (newWidth, newHeight) = self.__resizeWithRatio(cover.size[PIL_WIDTH], cover.size[PIL_HEIGHT], FULLSIZE_WIDTH, FULLSIZE_HEIGHT) # Resize it cover = cover.resize((newWidth, newHeight), Image.ANTIALIAS) # We're done cover.save(outFile, format) except: logger.error('[%s] An error occurred while generating a showable full size cover\n\n%s' % (MOD_NAME, traceback.format_exc())) def generateThumbnail(self, inFile, outFile, format): """ Generate a thumbnail from inFile (e.g., resize it) and write it to outFile (outFile and inFile may be equal) """ import Image try: # Open the image cover = Image.open(inFile).convert('RGBA') # Fit the image into THUMBNAIL_WIDTH x THUMBNAIL_HEIGHT (newWidth, newHeight) = self.__resizeWithRatio(cover.size[PIL_WIDTH], cover.size[PIL_HEIGHT], THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT) # We need to shift the image if it doesn't fully fill the thumbnail if newWidth < THUMBNAIL_WIDTH: offsetX = (THUMBNAIL_WIDTH - newWidth) / 2 else: offsetX = 0 if newHeight < THUMBNAIL_HEIGHT: offsetY = (THUMBNAIL_HEIGHT - newHeight) / 2 else: offsetY = 0 # Resize the image cover = cover.resize((newWidth, newHeight), Image.ANTIALIAS) # Paste the resized cover into our model model = Image.open(THUMBNAIL_MODEL).convert('RGBA') model.paste(cover, (THUMBNAIL_OFFSETX + offsetX, THUMBNAIL_OFFSETY + offsetY), cover) cover = model # Don't apply the gloss effect if asked to if not prefs.getCmdLine()[0].no_glossy_cover: gloss = Image.open(THUMBNAIL_GLOSS).convert('RGBA') cover.paste(gloss, (0, 0), gloss) # We're done cover.save(outFile, format) except: logger.error('[%s] An error occurred while generating a thumbnail\n\n%s' % (MOD_NAME, traceback.format_exc())) def getUserCover(self, trackPath): """ Return the path to a cover file in trackPath, None if no cover found """ splitPath = tools.splitPath(trackPath) if prefs.get(__name__, 'search-in-parent-dirs', PREFS_DFT_SEARCH_IN_PARENT_DIRS): lvls = len(splitPath) else: lvls = 1 while lvls != 0: # Create the path we're currently looking into currPath = os.path.join(*splitPath) # Create a dictionary with candidates candidates = {} for (file, path) in tools.listDir(currPath, True): (name, ext) = os.path.splitext(file.lower()) if ext in ACCEPTED_FILE_FORMATS: candidates[name] = path # Check each possible name using its index in the list as its priority for name in prefs.get(__name__, 'user-cover-filenames', PREFS_DFT_USER_COVER_FILENAMES): if name in candidates: return candidates[name] if name == '*' and len(candidates) != 0: return candidates.values()[0] # No cover found, let's go one level higher lvls -= 1 splitPath = splitPath[:-1] return None def getFromCache(self, artist, album): """ Return the path to the cached cover, or None if it's not cached """ cachePath = os.path.join(self.cacheRootPath, str(abs(hash(artist)))) cacheIdxPath = os.path.join(cachePath, 'INDEX') try: cacheIdx = tools.pickleLoad(cacheIdxPath) cover = os.path.join(cachePath, cacheIdx[artist + album]) if os.path.exists(cover): return cover except: pass return None def __getFromInternet(self, artist, album): """ Try to download the cover from the Internet If successful, add it to the cache and return the path to it Otherwise, return None """ import socket, urllib2 # Make sure to not be blocked by the request socket.setdefaulttimeout(consts.socketTimeout) # Request information to Last.fm # Beware of UTF-8 characters: we need to percent-encode all characters try: url = 'http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=%s&artist=%s&album=%s' % (AS_API_KEY, tools.percentEncode(artist), tools.percentEncode(album)) request = urllib2.Request(url, headers = {'User-Agent': USER_AGENT}) stream = urllib2.urlopen(request) data = stream.read() except urllib2.HTTPError, err: if err.code == 400: logger.error('[%s] No known cover for %s / %s' % (MOD_NAME, artist, album)) else: logger.error('[%s] Information request failed\n\n%s' % (MOD_NAME, traceback.format_exc())) return None except: logger.error('[%s] Information request failed\n\n%s' % (MOD_NAME, traceback.format_exc())) return None # Extract the URL to the cover image malformed = True startIdx = data.find(AS_TAG_START) endIdx = data.find(AS_TAG_END, startIdx) if startIdx != -1 and endIdx != -1: coverURL = data[startIdx+len(AS_TAG_START):endIdx] coverFormat = os.path.splitext(coverURL)[1].lower() if coverURL.startswith('http://') and coverFormat in ACCEPTED_FILE_FORMATS: malformed = False if malformed: logger.error('[%s] Received malformed data\n\n%s' % (MOD_NAME, data)) return None # Download the cover image try: request = urllib2.Request(coverURL, headers = {'User-Agent': USER_AGENT}) stream = urllib2.urlopen(request) data = stream.read() if len(data) < 1024: raise Exception, 'The cover image seems incorrect (%u bytes is too small)' % len(data) except: logger.error('[%s] Cover image request failed\n\n%s' % (MOD_NAME, traceback.format_exc())) return None # So far, so good: let's cache the image cachePath = os.path.join(self.cacheRootPath, str(abs(hash(artist)))) cacheIdxPath = os.path.join(cachePath, 'INDEX') if not os.path.exists(cachePath): os.mkdir(cachePath) try: cacheIdx = tools.pickleLoad(cacheIdxPath) except: cacheIdx = {} nextInt = len(cacheIdx) + 1 filename = str(nextInt) + coverFormat coverPath = os.path.join(cachePath, filename) cacheIdx[artist + album] = filename tools.pickleSave(cacheIdxPath, cacheIdx) try: output = open(coverPath, 'wb') output.write(data) output.close() return coverPath except: logger.error('[%s] Could not save the downloaded cover\n\n%s' % (MOD_NAME, traceback.format_exc())) return None def getFromInternet(self, artist, album): """ Wrapper for __getFromInternet(), manage blacklist """ # If we already tried without success, don't try again if (artist, album) in self.coverBlacklist: return None # Otherwise, try to download the cover cover = self.__getFromInternet(artist, album) # If the download failed, blacklist the album if cover is None: self.coverBlacklist[(artist, album)] = None return cover # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ self.cfgWin = None # Configuration window self.coverMap = {} # Store covers previously requested self.currTrack = None # The current track being played, if any self.cacheRootPath = os.path.join(consts.dirCfg, MOD_NAME) # Local cache for Internet covers self.coverBlacklist = {} # When a cover cannot be downloaded, avoid requesting it again if not os.path.exists(self.cacheRootPath): os.mkdir(self.cacheRootPath) def onModUnloaded(self): """ The module has been unloaded """ if self.currTrack is not None: modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': self.currTrack, 'pathThumbnail': None, 'pathFullSize': None}) # Delete covers that have been generated by this module for covers in self.coverMap.itervalues(): if os.path.exists(covers[CVR_THUMB]): os.remove(covers[CVR_THUMB]) if os.path.exists(covers[CVR_FULL]): os.remove(covers[CVR_FULL]) self.coverMap = None # Delete blacklist self.coverBlacklist = None def onNewTrack(self, track): """ A new track is being played, try to retrieve the corresponding cover """ # Make sure we have enough information if track.getArtist() == consts.UNKNOWN_ARTIST or track.getAlbum() == consts.UNKNOWN_ALBUM: modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': track, 'pathThumbnail': None, 'pathFullSize': None}) return album = track.getAlbum().lower() artist = track.getArtist().lower() rawCover = None self.currTrack = track # Let's see whether we already have the cover if (artist, album) in self.coverMap: covers = self.coverMap[(artist, album)] pathFullSize = covers[CVR_FULL] pathThumbnail = covers[CVR_THUMB] # Make sure the files are still there if os.path.exists(pathThumbnail) and os.path.exists(pathFullSize): modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': track, 'pathThumbnail': pathThumbnail, 'pathFullSize': pathFullSize}) return # Should we check for a user cover? if not prefs.get(__name__, 'download-covers', PREFS_DFT_DOWNLOAD_COVERS) \ or prefs.get(__name__, 'prefer-user-covers', PREFS_DFT_PREFER_USER_COVERS): rawCover = self.getUserCover(os.path.dirname(track.getFilePath())) # Is it in our cache? if rawCover is None: rawCover = self.getFromCache(artist, album) # If we still don't have a cover, maybe we can try to download it if rawCover is None: modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': track, 'pathThumbnail': None, 'pathFullSize': None}) if prefs.get(__name__, 'download-covers', PREFS_DFT_DOWNLOAD_COVERS): rawCover = self.getFromInternet(artist, album) # If we still don't have a cover, too bad # Otherwise, generate a thumbnail and a full size cover, and add it to our cover map if rawCover is not None: import tempfile thumbnail = tempfile.mktemp() + '.png' fullSizeCover = tempfile.mktemp() + '.png' self.generateThumbnail(rawCover, thumbnail, 'PNG') self.generateFullSizeCover(rawCover, fullSizeCover, 'PNG') if os.path.exists(thumbnail) and os.path.exists(fullSizeCover): self.coverMap[(artist, album)] = (thumbnail, fullSizeCover) modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': track, 'pathThumbnail': thumbnail, 'pathFullSize': fullSizeCover}) else: modules.postMsg(consts.MSG_CMD_SET_COVER, {'track': track, 'pathThumbnail': None, 'pathFullSize': None}) # --== Configuration ==-- def configure(self, parent): """ Show the configuration window """ if self.cfgWin is None: from gui.window import Window self.cfgWin = Window('Covers.glade', 'vbox1', __name__, MOD_INFO[modules.MODINFO_L10N], 320, 265) self.cfgWin.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWin.getWidget('img-lastfm').set_from_file(os.path.join(consts.dirPix, 'audioscrobbler.png')) self.cfgWin.getWidget('btn-help').connect('clicked', self.onBtnHelp) self.cfgWin.getWidget('chk-downloadCovers').connect('toggled', self.onDownloadCoversToggled) self.cfgWin.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWin.hide()) if not self.cfgWin.isVisible(): downloadCovers = prefs.get(__name__, 'download-covers', PREFS_DFT_DOWNLOAD_COVERS) preferUserCovers = prefs.get(__name__, 'prefer-user-covers', PREFS_DFT_PREFER_USER_COVERS) userCoverFilenames = prefs.get(__name__, 'user-cover-filenames', PREFS_DFT_USER_COVER_FILENAMES) searchInParentDirs = prefs.get(__name__, 'search-in-parent-dirs', PREFS_DFT_SEARCH_IN_PARENT_DIRS) self.cfgWin.getWidget('btn-ok').grab_focus() self.cfgWin.getWidget('txt-filenames').set_text(', '.join(userCoverFilenames)) self.cfgWin.getWidget('chk-downloadCovers').set_active(downloadCovers) self.cfgWin.getWidget('chk-preferUserCovers').set_active(preferUserCovers) self.cfgWin.getWidget('chk-preferUserCovers').set_sensitive(downloadCovers) self.cfgWin.getWidget('chk-searchInParentDirs').set_active(searchInParentDirs) self.cfgWin.show() def onBtnOk(self, btn): """ Save configuration """ downloadCovers = self.cfgWin.getWidget('chk-downloadCovers').get_active() preferUserCovers = self.cfgWin.getWidget('chk-preferUserCovers').get_active() searchInParentDirs = self.cfgWin.getWidget('chk-searchInParentDirs').get_active() userCoverFilenames = [word.strip() for word in self.cfgWin.getWidget('txt-filenames').get_text().split(',')] prefs.set(__name__, 'download-covers', downloadCovers) prefs.set(__name__, 'prefer-user-covers', preferUserCovers) prefs.set(__name__, 'user-cover-filenames', userCoverFilenames) prefs.set(__name__, 'search-in-parent-dirs', searchInParentDirs) self.cfgWin.hide() def onDownloadCoversToggled(self, downloadCovers): """ Toggle the "prefer user covers" checkbox according to the state of the "download covers" one """ self.cfgWin.getWidget('chk-preferUserCovers').set_sensitive(downloadCovers.get_active()) def onBtnHelp(self, btn): """ Display a small help message box """ from gui import help helpDlg = help.HelpDlg(MOD_INFO[modules.MODINFO_L10N]) helpDlg.addSection(_('Description'), _('This module displays the cover of the album the current track comes from. Covers ' 'may be loaded from local pictures, located in the same directory as the current ' 'track, or may be downloaded from the Internet.')) helpDlg.addSection(_('User Covers'), _('A user cover is a picture located in the same directory as the current track. ' 'When specifying filenames, you do not need to provide file extensions, supported ' 'file formats (%s) are automatically used. This module can be configured to search ' 'for user covers in parent directories are well.' % ', '.join(ACCEPTED_FILE_FORMATS.iterkeys()))) helpDlg.addSection(_('Internet Covers'), _('Covers may be downloaded from the Internet, based on the tags of the current track. ' 'You can ask to always prefer user covers to Internet ones. In this case, if a user ' 'cover exists for the current track, it is used. If there is none, the cover is downloaded.')) helpDlg.show(self.cfgWin) ./decibel-audio-player-1.06/src/modules/CommandLine.py0000644000175000017500000000522211456551413022764 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import media, modules, os.path, traceback from tools import consts, log, pickleSave, pickleLoad, prefs MOD_INFO = ('Command Line Support', 'Command Line Support', '', [], True, False, consts.MODCAT_NONE) class CommandLine(modules.ThreadedModule): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_NEW_TRACKLIST: self.onNewTracklist, } modules.ThreadedModule.__init__(self, handlers) # --== Message handlers ==-- def onAppStarted(self): """ Try to fill the playlist by using the files given on the command line or by restoring the last playlist """ # The file 'saved-playlist.txt' uses an old format, we now use 'saved-playlist-2.txt' (options, args) = prefs.getCmdLine() self.savedPlaylist = os.path.join(consts.dirCfg, 'saved-playlist-2.txt') if len(args) != 0: log.logger.info('[%s] Filling playlist with files given on command line' % MOD_INFO[modules.MODINFO_NAME]) modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': media.getTracks(args), 'playNow': True}) else: try: tracks = [media.track.unserialize(serialTrack) for serialTrack in pickleLoad(self.savedPlaylist)] modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': tracks, 'playNow': False}) log.logger.info('[%s] Restored playlist' % MOD_INFO[modules.MODINFO_NAME]) except: log.logger.error('[%s] Unable to restore playlist from %s\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], self.savedPlaylist, traceback.format_exc())) def onNewTracklist(self, tracks, playtime): """ A new tracklist has been set """ pickleSave(self.savedPlaylist, [track.serialize() for track in tracks]) ./decibel-audio-player-1.06/src/modules/Tracklist.py0000644000175000017500000005660011456551413022544 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, gui, media, modules, tools from gui import fileChooser from tools import consts, icons from gettext import gettext as _ from gobject import TYPE_STRING, TYPE_INT, TYPE_PYOBJECT from gui.extListview import ExtListView MOD_INFO = ('Tracklist', 'Tracklist', '', [], True, False, consts.MODCAT_NONE) # Create a unique ID for each field of a row in the list ( ROW_ICO, # Icon drawn in front of the row ROW_NUM, # Track number ROW_TIT, # Track title ROW_ART, # Track artist ROW_ALB, # Track album ROW_LEN, # Track length in seconds ROW_BTR, # Bit rate ROW_GNR, # Genre ROW_DAT, # Date ROW_PTH, # Path to the file ROW_TRK # The Track object ) = range(11) # Create a unique ID for each column that the user can see ( COL_TRCK_NUM, COL_TITLE, COL_ARTIST, COL_ALBUM, COL_DATE, COL_GENRE, COL_LENGTH, COL_PATH, COL_BITRATE, ) = range(9) PREFS_DEFAULT_REPEAT_STATUS = False PREFS_DEFAULT_COLUMNS_VISIBILITY = { COL_TRCK_NUM : True, COL_TITLE : True, COL_ARTIST : True, COL_ALBUM : True, COL_DATE : False, COL_GENRE : False, COL_LENGTH : True, COL_BITRATE : False, COL_PATH : False, } class Tracklist(modules.Module): """ This module manages the tracklist """ def __init__(self): """ Constructor """ handlers = { consts.MSG_CMD_NEXT: self.jumpToNext, consts.MSG_EVT_PAUSED: lambda: self.onPausedToggled(icons.pauseMenuIcon()), consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: lambda: self.onPausedToggled(icons.playMenuIcon()), consts.MSG_CMD_PREVIOUS: self.jumpToPrevious, consts.MSG_EVT_NEED_BUFFER: self.onBufferingNeeded, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_CMD_TOGGLE_PAUSE: self.togglePause, consts.MSG_CMD_TRACKLIST_DEL: self.remove, consts.MSG_CMD_TRACKLIST_ADD: self.insert, consts.MSG_CMD_TRACKLIST_SET: self.set, consts.MSG_CMD_TRACKLIST_CLR: lambda: self.set(None, None), consts.MSG_EVT_TRACK_ENDED_OK: lambda: self.onTrackEnded(False), consts.MSG_CMD_TRACKLIST_REPEAT: self.setRepeat, consts.MSG_EVT_TRACK_ENDED_ERROR: lambda: self.onTrackEnded(True), consts.MSG_CMD_TRACKLIST_SHUFFLE: self.shuffleTracklist, } modules.Module.__init__(self, handlers) def __fmtColumnColor(self, col, cll, mdl, it): """ When playing, tracks already played are slightly greyed out """ style = self.window.get_style() played = self.list.hasMark() and mdl.get_path(it)[0] < self.list.getMark() if played: cll.set_property('foreground-gdk', style.text[gtk.STATE_INSENSITIVE]) else: cll.set_property('foreground-gdk', style.text[gtk.STATE_NORMAL]) def __fmtLengthColumn(self, col, cll, mdl, it): """ Format the column showing the length of the track (e.g., show 1:23 instead of 83) """ cll.set_property('text', tools.sec2str(mdl.get_value(it, ROW_LEN))) self.__fmtColumnColor(col, cll, mdl, it) def __getNextTrackIdx(self): """ Return the index of the next track, or -1 if there is none """ if self.list.hasMark(): if self.list.getMark() < (len(self.list) - 1): return self.list.getMark() + 1 elif self.btnRepeat.get_active(): return 0 return -1 def __hasNextTrack(self): """ Return whether there is a next track """ return self.__getNextTrackIdx() != -1 def __getPreviousTrackIdx(self): """ Return the index of the previous track, or -1 if there is none """ if self.list.hasMark(): if self.list.getMark() > 0: return self.list.getMark() - 1 elif self.btnRepeat.get_active(): return len(self.list) - 1 return -1 def __hasPreviousTrack(self): """ Return whether there is a previous track """ return self.__getPreviousTrackIdx() != -1 def jumpToNext(self): """ Jump to the next track, if any """ where = self.__getNextTrackIdx() if where != -1: self.jumpTo(where) def jumpToPrevious(self): """ Jump to the previous track, if any """ where = self.__getPreviousTrackIdx() if where != -1: self.jumpTo(where) def jumpTo(self, trackIdx, sendPlayMsg = True): """ Jump to the track located at the given index """ if self.list.hasMark() and self.list.getItem(self.list.getMark(), ROW_ICO) != icons.errorMenuIcon(): self.list.setItem(self.list.getMark(), ROW_ICO, icons.nullMenuIcon()) self.list.setMark(trackIdx) self.list.scroll_to_cell(trackIdx) self.list.setItem(trackIdx, ROW_ICO, icons.playMenuIcon()) if sendPlayMsg: modules.postMsg(consts.MSG_CMD_PLAY, {'uri': self.list.getItem(trackIdx, ROW_TRK).getURI()}) modules.postMsg(consts.MSG_EVT_NEW_TRACK, {'track': self.list.getRow(trackIdx)[ROW_TRK]}) modules.postMsg(consts.MSG_EVT_TRACK_MOVED, {'hasPrevious': self.__hasPreviousTrack(), 'hasNext': self.__hasNextTrack()}) def insert(self, tracks, playNow, position=None): """ Insert some tracks in the tracklist, append them if position is None """ rows = [[icons.nullMenuIcon(), track.getNumber(), track.getTitle(), track.getArtist(), track.getExtendedAlbum(), track.getLength(), track.getBitrate(), track.getGenre(), track.getDate(), track.getURI(), track] for track in tracks] if len(rows) != 0: self.previousTracklist = [row[ROW_TRK] for row in self.list] for row in rows: self.playtime += row[ROW_LEN] self.list.insertRows(rows, position) if playNow: if position is not None: self.jumpTo(position) else: self.jumpTo(len(self.previousTracklist)) def set(self, tracks, playNow): """ Replace the tracklist, clear it if tracks is None """ self.playtime = 0 # Save playlist only locally to this function # The insert() function would overwrite it otherwise previousTracklist = [row[ROW_TRK] for row in self.list] if self.list.hasMark() and ((not playNow) or (tracks is None) or (len(tracks) == 0)): modules.postMsg(consts.MSG_CMD_STOP) self.list.clear() if tracks is not None and len(tracks) != 0: self.insert(tracks, playNow) self.previousTracklist = previousTracklist def savePlaylist(self): """ Save the current tracklist to a playlist """ outFile = fileChooser.save(self.window, _('Save playlist'), 'playlist.m3u') if outFile is not None: allFiles = [row[ROW_TRK].getFilePath() for row in self.list.iterAllRows()] media.playlist.save(allFiles, outFile) def remove(self, idx=None): """ Remove the given track, or the selection if idx is None """ if idx is not None and (idx < 0 or idx >= len(self.list)): return hadMark = self.list.hasMark() self.previousTracklist = [row[ROW_TRK] for row in self.list] if idx is not None: self.playtime -= self.list.getRow(idx)[ROW_LEN] self.list.removeRow((idx, )) else: self.playtime -= sum([row[ROW_LEN] for row in self.list.iterSelectedRows()]) self.list.removeSelectedRows() self.list.unselectAll() if hadMark and not self.list.hasMark(): modules.postMsg(consts.MSG_CMD_STOP) def crop(self): """ Remove the unselected tracks """ hadMark = self.list.hasMark() self.previousTracklist = [row[ROW_TRK] for row in self.list] self.playtime = sum([row[ROW_LEN] for row in self.list.iterSelectedRows()]) self.list.cropSelectedRows() if hadMark and not self.list.hasMark(): modules.postMsg(consts.MSG_CMD_STOP) def revertTracklist(self): """ Back to the previous tracklist """ self.set(self.previousTracklist, False) self.previousTracklist = None def shuffleTracklist(self): """ Shuffle the tracks and ensure that the current track stays visible """ self.previousTracklist = [row[ROW_TRK] for row in self.list] self.list.shuffle() if self.list.hasMark(): self.list.scroll_to_cell(self.list.getMark()) def setRepeat(self, repeat): """ Set/Unset the repeat function """ if self.btnRepeat.get_active() != repeat: self.btnRepeat.clicked() def showPopupMenu(self, list, path, button, time): """ The index parameter may be None """ popup = gtk.Menu() # Crop crop = gtk.ImageMenuItem(_('Crop')) crop.set_image(gtk.image_new_from_stock(gtk.STOCK_CUT, gtk.ICON_SIZE_MENU)) popup.append(crop) if path is None: crop.set_sensitive(False) else: crop.connect('activate', lambda item: self.crop()) # Remove remove = gtk.ImageMenuItem(gtk.STOCK_REMOVE) popup.append(remove) if path is None: remove.set_sensitive(False) else: remove.connect('activate', lambda item: self.remove()) popup.append(gtk.SeparatorMenuItem()) # Shuffle shuffle = gtk.ImageMenuItem(_('Shuffle Playlist')) shuffle.set_image(gtk.image_new_from_icon_name('stock_shuffle', gtk.ICON_SIZE_MENU)) popup.append(shuffle) if len(list) == 0: shuffle.set_sensitive(False) else: shuffle.connect('activate', lambda item: modules.postMsg(consts.MSG_CMD_TRACKLIST_SHUFFLE)) # Revert revert = gtk.ImageMenuItem(_('Revert Playlist')) revert.set_image(gtk.image_new_from_stock(gtk.STOCK_REVERT_TO_SAVED, gtk.ICON_SIZE_MENU)) popup.append(revert) if self.previousTracklist is None: revert.set_sensitive(False) else: revert.connect('activate', lambda item: self.revertTracklist()) # Clear clear = gtk.ImageMenuItem(_('Clear Playlist')) clear.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU)) popup.append(clear) if len(list) == 0: clear.set_sensitive(False) else: clear.connect('activate', lambda item: modules.postMsg(consts.MSG_CMD_TRACKLIST_CLR)) popup.append(gtk.SeparatorMenuItem()) # Repeat repeat = gtk.CheckMenuItem(_('Repeat')) repeat.set_active(tools.prefs.get(__name__, 'repeat-status', PREFS_DEFAULT_REPEAT_STATUS)) repeat.connect('toggled', lambda item: self.btnRepeat.clicked()) popup.append(repeat) popup.append(gtk.SeparatorMenuItem()) # Save save = gtk.ImageMenuItem(_('Save Playlist As...')) save.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE_AS, gtk.ICON_SIZE_MENU)) popup.append(save) if len(list) == 0: save.set_sensitive(False) else: save.connect('activate', lambda item: self.savePlaylist()) popup.show_all() popup.popup(None, None, None, button, time) def togglePause(self): """ Start playing if not already playing """ if len(self.list) != 0 and not self.list.hasMark(): if self.list.getSelectedRowsCount() != 0: self.jumpTo(self.list.getFirstSelectedRowIndex()) else: self.jumpTo(0) # --== Message handlers ==-- def onAppStarted(self): """ This is the real initialization function, called when the module has been loaded """ wTree = tools.prefs.getWidgetsTree() self.playtime = 0 self.bufferedTrack = None self.previousTracklist = None # Retrieve widgets self.window = wTree.get_widget('win-main') self.btnClear = wTree.get_widget('btn-tracklistClear') self.btnRepeat = wTree.get_widget('btn-tracklistRepeat') self.btnShuffle = wTree.get_widget('btn-tracklistShuffle') self.btnClear.set_sensitive(False) self.btnShuffle.set_sensitive(False) # Create the list and its columns txtLRdr = gtk.CellRendererText() txtRRdr = gtk.CellRendererText() pixbufRdr = gtk.CellRendererPixbuf() txtRRdr.set_property('xalign', 1.0) # 'columns-visibility' may be broken, we should not use it (#311293) visible = tools.prefs.get(__name__, 'columns-visibility-2', PREFS_DEFAULT_COLUMNS_VISIBILITY) for (key, value) in PREFS_DEFAULT_COLUMNS_VISIBILITY.iteritems(): if key not in visible: visible[key] = value columns = (('#', [(pixbufRdr, gtk.gdk.Pixbuf), (txtRRdr, TYPE_INT)], (ROW_NUM, ROW_TIT), False, visible[COL_TRCK_NUM]), (_('Title'), [(txtLRdr, TYPE_STRING)], (ROW_TIT,), True, visible[COL_TITLE]), (_('Artist'), [(txtLRdr, TYPE_STRING)], (ROW_ART, ROW_ALB, ROW_NUM, ROW_TIT), True, visible[COL_ARTIST]), (_('Album'), [(txtLRdr, TYPE_STRING)], (ROW_ALB, ROW_NUM, ROW_TIT), True, visible[COL_ALBUM]), (_('Length'), [(txtRRdr, TYPE_INT)], (ROW_LEN,), False, visible[COL_LENGTH]), (_('Bit Rate'), [(txtRRdr, TYPE_STRING)], (ROW_BTR, ROW_ART, ROW_ALB, ROW_NUM, ROW_TIT), False, visible[COL_BITRATE]), (_('Genre'), [(txtLRdr, TYPE_STRING)], (ROW_GNR, ROW_ART, ROW_ALB, ROW_NUM, ROW_TIT), False, visible[COL_GENRE]), (_('Date'), [(txtLRdr, TYPE_INT)], (ROW_DAT, ROW_ART, ROW_ALB, ROW_NUM, ROW_TIT), False, visible[COL_DATE]), (_('Path'), [(txtLRdr, TYPE_STRING)], (ROW_PTH,), False, visible[COL_PATH]), (None, [(None, TYPE_PYOBJECT)], (None,), False, False)) self.list = ExtListView(columns, sortable=True, dndTargets=consts.DND_TARGETS.values(), useMarkup=False, canShowHideColumns=True) self.list.get_column(1).set_cell_data_func(txtLRdr, self.__fmtColumnColor) self.list.get_column(4).set_cell_data_func(txtRRdr, self.__fmtLengthColumn) self.list.enableDNDReordering() wTree.get_widget('scrolled-tracklist').add(self.list) # GTK handlers self.list.connect('extlistview-dnd', self.onDND) self.list.connect('key-press-event', self.onKeyboard) self.list.connect('extlistview-modified', self.onListModified) self.list.connect('extlistview-button-pressed', self.onButtonPressed) self.list.connect('extlistview-selection-changed', self.onSelectionChanged) self.list.connect('extlistview-column-visibility-changed', self.onColumnVisibilityChanged) self.btnClear.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_TRACKLIST_CLR)) self.btnRepeat.connect('toggled', self.onButtonRepeat) self.btnShuffle.connect('clicked', lambda widget: modules.postMsg(consts.MSG_CMD_TRACKLIST_SHUFFLE)) # Restore preferences self.btnRepeat.set_active(tools.prefs.get(__name__, 'repeat-status', PREFS_DEFAULT_REPEAT_STATUS)) # Set icons wTree.get_widget('img-repeat').set_from_icon_name('stock_repeat', gtk.ICON_SIZE_BUTTON) wTree.get_widget('img-shuffle').set_from_icon_name('stock_shuffle', gtk.ICON_SIZE_BUTTON) def onTrackEnded(self, withError): """ The current track has ended, jump to the next one if any """ currIdx = self.list.getMark() # If an error occurred with the current track, flag it as such if withError: self.list.setItem(currIdx, ROW_ICO, icons.errorMenuIcon()) # Find the next 'playable' track (not already flagged) if self.btnRepeat.get_active(): nbTracks = len(self.list) else: nbTracks = len(self.list) - 1 - currIdx for i in xrange(nbTracks): currIdx = (currIdx + 1) % len(self.list) if self.list.getItem(currIdx, ROW_ICO) != icons.errorMenuIcon(): track = self.list.getItem(currIdx, ROW_TRK).getURI() self.jumpTo(currIdx, track != self.bufferedTrack) self.bufferedTrack = None return self.bufferedTrack = None modules.postMsg(consts.MSG_CMD_STOP) def onBufferingNeeded(self): """ The current track is close to its end, so we try to buffer the next one to avoid gaps """ where = self.__getNextTrackIdx() if where != -1: self.bufferedTrack = self.list.getItem(where, ROW_TRK).getURI() modules.postMsg(consts.MSG_CMD_BUFFER, {'uri': self.bufferedTrack}) def onStopped(self): """ Playback has been stopped """ if self.list.hasMark(): currTrack = self.list.getMark() if self.list.getItem(currTrack, ROW_ICO) != icons.errorMenuIcon(): self.list.setItem(currTrack, ROW_ICO, icons.nullMenuIcon()) self.list.clearMark() def onPausedToggled(self, icon): """ Switch between paused and unpaused """ if self.list.hasMark(): self.list.setItem(self.list.getMark(), ROW_ICO, icon) # --== GTK handlers ==-- def onButtonRepeat(self, btn): """ The 'repeat' button has been pressed """ tools.prefs.set(__name__, 'repeat-status', self.btnRepeat.get_active()) modules.postMsg(consts.MSG_EVT_REPEAT_CHANGED, {'repeat': self.btnRepeat.get_active()}) if self.list.hasMark(): modules.postMsg(consts.MSG_EVT_TRACK_MOVED, {'hasPrevious': self.__hasPreviousTrack(), 'hasNext': self.__hasNextTrack()}) def onButtonPressed(self, list, event, path): """ Play the selected track on double click, or show a popup menu on right click """ if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS and path is not None: self.jumpTo(path[0]) elif event.button == 3: self.showPopupMenu(list, path, event.button, event.time) def onKeyboard(self, list, event): """ Keyboard shortcuts """ keyname = gtk.gdk.keyval_name(event.keyval) if keyname == 'Delete': self.remove() elif keyname == 'Return': self.jumpTo(self.list.getFirstSelectedRowIndex()) elif keyname == 'space': modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE) elif keyname == 'Escape': modules.postMsg(consts.MSG_CMD_STOP) elif keyname == 'Left': modules.postMsg(consts.MSG_CMD_STEP, {'seconds': -5}) elif keyname == 'Right': modules.postMsg(consts.MSG_CMD_STEP, {'seconds': 5}) def onListModified(self, list): """ Some rows have been added/removed/moved """ self.btnClear.set_sensitive(len(list) != 0) self.btnShuffle.set_sensitive(len(list) != 0) # Update playlist length and playlist position for all tracks for position, row in enumerate(self.list): row[ROW_TRK].setPlaylistPos(position + 1) row[ROW_TRK].setPlaylistLen(len(self.list)) allTracks = [row[ROW_TRK] for row in self.list] modules.postMsg(consts.MSG_EVT_NEW_TRACKLIST, {'tracks': allTracks, 'playtime': self.playtime}) if self.list.hasMark(): modules.postMsg(consts.MSG_EVT_TRACK_MOVED, {'hasPrevious': self.__hasPreviousTrack(), 'hasNext': self.__hasNextTrack()}) def onSelectionChanged(self, list, selectedRows): """ The selection has changed """ modules.postMsg(consts.MSG_EVT_TRACKLIST_NEW_SEL, {'tracks': [row[ROW_TRK] for row in selectedRows]}) def onColumnVisibilityChanged(self, list, colTitle, visible): """ A column has been shown/hidden """ if colTitle == '#': colId = COL_TRCK_NUM elif colTitle == _('Title'): colId = COL_TITLE elif colTitle == _('Artist'): colId = COL_ARTIST elif colTitle == _('Album'): colId = COL_ALBUM elif colTitle == _('Length'): colId = COL_LENGTH elif colTitle == _('Genre'): colId = COL_GENRE elif colTitle == _('Date'): colId = COL_DATE elif colTitle == _('Bit Rate'): colId = COL_BITRATE else: colId = COL_PATH visibility = tools.prefs.get(__name__, 'columns-visibility-2', PREFS_DEFAULT_COLUMNS_VISIBILITY) visibility[colId] = visible tools.prefs.set(__name__, 'columns-visibility-2', visibility) def onDND(self, list, context, x, y, dragData, dndId, time): """ External Drag'n'Drop """ import urllib if dragData.data == '': context.finish(False, False, time) return # A list of filenames, without 'file://' at the beginning if dndId == consts.DND_DAP_URI: tracks = media.getTracks([urllib.url2pathname(uri) for uri in dragData.data.split()]) # A list of filenames starting with 'file://' elif dndId == consts.DND_URI: tracks = media.getTracks([urllib.url2pathname(uri)[7:] for uri in dragData.data.split()]) # A list of tracks elif dndId == consts.DND_DAP_TRACKS: tracks = [media.track.unserialize(serialTrack) for serialTrack in dragData.data.split('\n')] dropInfo = list.get_dest_row_at_pos(x, y) # Insert the tracks, but beware of the AFTER/BEFORE mechanism used by GTK if dropInfo is None: self.insert(tracks, False) elif dropInfo[1] == gtk.TREE_VIEW_DROP_AFTER: self.insert(tracks, False, dropInfo[0][0] + 1) else: self.insert(tracks, False, dropInfo[0][0]) context.finish(True, False, time) ./decibel-audio-player-1.06/src/modules/IMStatus.py0000644000175000017500000003727311456551413022322 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules, traceback from tools import consts, prefs from gettext import gettext as _ from tools.log import logger MOD_INFO = ('Instant Messenger Status', _('Instant Messenger Status'), _('Update the status message of your IM client'), [], False, True, consts.MODCAT_DESKTOP) MOD_NAME = MOD_INFO[modules.MODINFO_NAME] # Possible actions upon stopping or quitting ( STOP_DO_NOTHING, STOP_SET_STATUS ) = range(2) # Default preferences DEFAULT_STATUS_MSG = '♫ {artist} - {album} ♫' DEFAULT_STOP_ACTION = STOP_SET_STATUS DEFAULT_STOP_STATUS = _('Decibel is stopped') DEFAULT_SANITIZED_WORDS = '' DEFAULT_UPDATE_ON_PAUSED = True DEFAULT_UPDATE_WHEN_AWAY = False ############################################################################## class Gaim: def __init__(self, dbusInterface): """ Constructor """ self.dbusInterface = dbusInterface def listAccounts(self): """ Return a default account """ return ['GenericAccount'] def setStatusMsg(self, account, msg): """ Change the status message of the given account """ try: current = self.dbusInterface.GaimSavedstatusGetCurrent() statusType = self.dbusInterface.GaimSavedstatusGetType(current) statusId = self.dbusInterface.GaimPrimitiveGetIdFromType(statusType) if statusId == 'available' or prefs.get(__name__, 'update-when-away', DEFAULT_UPDATE_WHEN_AWAY): saved = self.dbusInterface.GaimSavedstatusNew('', statusType) self.dbusInterface.GaimSavedstatusSetMessage(saved, msg) self.dbusInterface.GaimSavedstatusActivate(saved) except: logger.error('[%s] Unable to set Gaim status\n\n%s' % (MOD_NAME, traceback.format_exc())) ############################################################################## class Gajim: def __init__(self, dbusInterface): """ Constructor """ self.dbusInterface = dbusInterface def listAccounts(self): """ Return a list of existing accounts """ try: return [account for account in self.dbusInterface.list_accounts()] except: logger.error('[%s] Unable to list Gajim accounts\n\n%s' % (MOD_NAME, traceback.format_exc())) return [] def setStatusMsg(self, account, msg): """ Change the status message of the given account """ try: currentStatus = self.dbusInterface.get_status(account) if currentStatus in ('online', 'chat') or prefs.get(__name__, 'update-when-away', DEFAULT_UPDATE_WHEN_AWAY): self.dbusInterface.change_status(currentStatus, msg, account) except: logger.error('[%s] Unable to set Gajim status\n\n%s' % (MOD_NAME, traceback.format_exc())) ############################################################################## class Gossip: def __init__(self, dbusInterface): """ Constructor """ self.dbusInterface = dbusInterface def listAccounts(self): """ Return a default account """ return ['GenericAccount'] def setStatusMsg(self, account, msg): """ Change the status message of the given account """ try: currentStatus, currentMsg = self.dbusInterface.GetPresence('') if currentStatus == 'available' or prefs.get(__name__, 'update-when-away', DEFAULT_UPDATE_WHEN_AWAY): self.dbusInterface.SetPresence(currentStatus, msg) except: logger.error('[%s] Unable to set Gossip status\n\n%s' % (MOD_NAME, traceback.format_exc())) ############################################################################## class Pidgin: def __init__(self, dbusInterface): """ Constructor """ self.dbusInterface = dbusInterface def listAccounts(self): """ Return a default account """ return ['GenericAccount'] def setStatusMsg(self, account, msg): """ Change the status message of the given account """ try: current = self.dbusInterface.PurpleSavedstatusGetCurrent() # This used to be needed, but seems to have been fixed in Pidgin # statusType = dbus.UInt32(self.dbusInterface.PurpleSavedstatusGetType(current)) statusType = self.dbusInterface.PurpleSavedstatusGetType(current) statusId = self.dbusInterface.PurplePrimitiveGetIdFromType(statusType) if statusId == 'available' or prefs.get(__name__, 'update-when-away', DEFAULT_UPDATE_WHEN_AWAY): saved = self.dbusInterface.PurpleSavedstatusNew('', statusType) self.dbusInterface.PurpleSavedstatusSetMessage(saved, msg) self.dbusInterface.PurpleSavedstatusActivate(saved) except: logger.error('[%s] Unable to set Pidgin status\n\n%s' % (MOD_NAME, traceback.format_exc())) ############################################################################## # Elements associated with each supported IM clients ( IM_NAME, IM_DBUS_SERVICE_NAME, IM_DBUS_OBJECT_NAME, IM_DBUS_INTERFACE_NAME, IM_CLASS, IM_INSTANCE, IM_ACCOUNTS ) = range(7) # All specific classes have been defined, so we can now populate the list of supported IM clients CLIENTS = ( ['Gajim', 'org.gajim.dbus', '/org/gajim/dbus/RemoteObject', 'org.gajim.dbus.RemoteInterface', Gajim, None, []], ['Gossip', 'org.gnome.Gossip', '/org/gnome/Gossip', 'org.gnome.Gossip', Gossip, None, []], ['Gaim', 'net.sf.gaim.GaimService', '/net/sf/gaim/GaimObject', 'net.sf.gaim.GaimInterface', Gaim, None, []], ['Pidgin', 'im.pidgin.purple.PurpleService', '/im/pidgin/purple/PurpleObject', 'im.pidgin.purple.PurpleInterfacep', Pidgin, None, []] ) class IMStatus(modules.Module): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_APP_QUIT: self.onStopped, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onStopped, } modules.Module.__init__(self, handlers) def __format(self, string, track): """ Replace the special fields in the given string by their corresponding value and sanitize the result """ result = track.format(string) if len(prefs.get(__name__, 'sanitized-words', DEFAULT_SANITIZED_WORDS)) != 0: lowerResult = result.lower() for word in [w.lower() for w in prefs.get(__name__, 'sanitized-words', DEFAULT_SANITIZED_WORDS).split('\n') if len(w) > 2]: pos = lowerResult.find(word) while pos != -1: result = result[:pos+1] + ('*' * (len(word)-2)) + result[pos+len(word)-1:] lowerResult = lowerResult[:pos+1] + ('*' * (len(word)-2)) + lowerResult[pos+len(word)-1:] pos = lowerResult.find(word) return result def setStatusMsg(self, status): """ Update the status of all accounts of all active IM clients """ for client in self.clients: for account in client[IM_ACCOUNTS]: client[IM_INSTANCE].setStatusMsg(account, status) # --== Message handlers ==-- def onModLoaded(self): """ Initialize the module """ self.track = None # Current track self.status = '' # The currently used status self.paused = False # True if the current track is paused self.clients = [] # Clients currently active self.cfgWindow = None # Configuration window # Detect active clients try: import dbus session = dbus.SessionBus() activeServices = session.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus').ListNames() for activeClient in [client for client in CLIENTS if client[IM_DBUS_SERVICE_NAME] in activeServices]: obj = session.get_object(activeClient[IM_DBUS_SERVICE_NAME], activeClient[IM_DBUS_OBJECT_NAME]) interface = dbus.Interface(obj, activeClient[IM_DBUS_INTERFACE_NAME]) activeClient[IM_INSTANCE] = activeClient[IM_CLASS](interface) activeClient[IM_ACCOUNTS] = activeClient[IM_INSTANCE].listAccounts() logger.info('[%s] Found %s instance' % (MOD_NAME, activeClient[IM_NAME])) self.clients.append(activeClient) except: logger.error('[%s] Error while initializing\n\n%s' % (MOD_NAME, traceback.format_exc())) def onNewTrack(self, track): """ A new track is being played """ self.track = track self.status = self.__format(prefs.get(__name__, 'status-msg', DEFAULT_STATUS_MSG), track) self.paused = False self.setStatusMsg(self.status) def onStopped(self): """ The current track has been stopped """ self.track = None self.paused = False if prefs.get(__name__, 'stop-action', DEFAULT_STOP_ACTION) == STOP_SET_STATUS: self.setStatusMsg(prefs.get(__name__, 'stop-status', DEFAULT_STOP_STATUS)) def onPaused(self): """ The current track has been paused """ self.paused = True if prefs.get(__name__, 'update-on-paused', DEFAULT_UPDATE_ON_PAUSED): self.setStatusMsg(_('%(status)s [paused]') % {'status': self.status}) def onUnpaused(self): """ The current track has been unpaused """ self.paused = False self.setStatusMsg(self.status) # --== Configuration ==-- def configure(self, parent): """ Show the configuration window """ if self.cfgWindow is None: from gui.window import Window self.cfgWindow = Window('IMStatus.glade', 'vbox1', __name__, _(MOD_NAME), 440, 290) # GTK handlers self.cfgWindow.getWidget('rad-stopDoNothing').connect('toggled', self.onRadToggled) self.cfgWindow.getWidget('rad-stopSetStatus').connect('toggled', self.onRadToggled) self.cfgWindow.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWindow.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWindow.hide()) self.cfgWindow.getWidget('btn-help').connect('clicked', self.onBtnHelp) if not self.cfgWindow.isVisible(): self.cfgWindow.getWidget('txt-status').set_text(prefs.get(__name__, 'status-msg', DEFAULT_STATUS_MSG)) self.cfgWindow.getWidget('chk-updateOnPaused').set_active(prefs.get(__name__, 'update-on-paused', DEFAULT_UPDATE_ON_PAUSED)) self.cfgWindow.getWidget('chk-updateWhenAway').set_active(prefs.get(__name__, 'update-when-away', DEFAULT_UPDATE_WHEN_AWAY)) self.cfgWindow.getWidget('rad-stopDoNothing').set_active(prefs.get(__name__, 'stop-action', DEFAULT_STOP_ACTION) == STOP_DO_NOTHING) self.cfgWindow.getWidget('rad-stopSetStatus').set_active(prefs.get(__name__, 'stop-action', DEFAULT_STOP_ACTION) == STOP_SET_STATUS) self.cfgWindow.getWidget('txt-stopStatus').set_sensitive(prefs.get(__name__, 'stop-action', DEFAULT_STOP_ACTION) == STOP_SET_STATUS) self.cfgWindow.getWidget('txt-stopStatus').set_text(prefs.get(__name__, 'stop-status', DEFAULT_STOP_STATUS)) self.cfgWindow.getWidget('txt-sanitizedWords').get_buffer().set_text(prefs.get(__name__, 'sanitized-words', DEFAULT_SANITIZED_WORDS)) self.cfgWindow.getWidget('btn-ok').grab_focus() self.cfgWindow.show() def onRadToggled(self, btn): """ A radio button has been toggled """ self.cfgWindow.getWidget('txt-stopStatus').set_sensitive(self.cfgWindow.getWidget('rad-stopSetStatus').get_active()) def onBtnOk(self, btn): """ Save new preferences """ prefs.set(__name__, 'status-msg', self.cfgWindow.getWidget('txt-status').get_text()) prefs.set(__name__, 'update-on-paused', self.cfgWindow.getWidget('chk-updateOnPaused').get_active()) prefs.set(__name__, 'update-when-away', self.cfgWindow.getWidget('chk-updateWhenAway').get_active()) (start, end) = self.cfgWindow.getWidget('txt-sanitizedWords').get_buffer().get_bounds() prefs.set(__name__, 'sanitized-words', self.cfgWindow.getWidget('txt-sanitizedWords').get_buffer().get_text(start, end).strip()) if self.cfgWindow.getWidget('rad-stopDoNothing').get_active(): prefs.set(__name__, 'stop-action', STOP_DO_NOTHING) else: prefs.set(__name__, 'stop-action', STOP_SET_STATUS) prefs.set(__name__, 'stop-status', self.cfgWindow.getWidget('txt-stopStatus').get_text()) self.cfgWindow.hide() # Update status if self.track is not None: self.status = self.__format(prefs.get(__name__, 'status-msg', DEFAULT_STATUS_MSG), self.track) if self.paused: self.setStatusMsg(_('%(status)s [paused]') % {'status': self.status}) else: self.setStatusMsg(self.status) def onBtnHelp(self, btn): """ Display a small help message box """ import gui.help, media.track helpDlg = gui.help.HelpDlg(_(MOD_NAME)) helpDlg.addSection(_('Description'), _('This module detects any running instant messenger and updates your status with regards to the track ' 'you are listening to. Supported messengers are:') + '\n\n * ' + '\n * '.join(sorted([client[IM_NAME] for client in CLIENTS]))) helpDlg.addSection(_('Customizing the Status'), _('You can set the status to any text you want. Before setting it, the module replaces all fields of ' 'the form {field} by their corresponding value. Available fields are:') + '\n\n' + media.track.getFormatSpecialFields(False)) helpDlg.addSection(_('Markup'), _('You can use the Pango markup language to format the text. More information on that language is ' 'available on the following web page:') + '\n\nhttp://www.pygtk.org/pygtk2reference/pango-markup-language.html') helpDlg.addSection(_('Sanitization'), _('You can define some words that to sanitize before using them to set your status. In this ' 'case, the middle characters of matching words is automatically replaced with asterisks ' '(e.g., "Metallica - Live S**t Binge & Purge"). Put one word per line.')) helpDlg.show(self.cfgWindow) ./decibel-audio-player-1.06/src/modules/ReplayGain.py0000644000175000017500000000332211456551413022630 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules from tools import consts from gettext import gettext as _ MOD_INFO = ('ReplayGain', _('ReplayGain'), _('Normalize volume'), [], False, False, consts.MODCAT_DECIBEL) class ReplayGain(modules.Module): """ This module enables the GStreamer ReplayGain element """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_MOD_LOADED: self.onRestartRequired, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_MOD_UNLOADED: self.onRestartRequired, } modules.Module.__init__(self, handlers) # --== Message handlers ==-- def onAppStarted(self): """ The application has just been started """ modules.postMsg(consts.MSG_CMD_ENABLE_RG) def onRestartRequired(self): """ A restart of the application is required """ self.restartRequired() ./decibel-audio-player-1.06/src/modules/StatusbarTitlebar.py0000644000175000017500000001155711456551413024245 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules, tools from tools import consts, prefs from gettext import ngettext, gettext as _ MOD_INFO = ('Status and Title Bars', 'Status and Title Bars', '', [], True, False, consts.MODCAT_NONE) class StatusbarTitlebar(modules.Module): """ This module manages both the status and the title bars """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_NEW_TRACKLIST: self.onNewTracklist, consts.MSG_EVT_TRACKLIST_NEW_SEL: self.onNewSelection, } modules.Module.__init__(self, handlers) def __updateTitlebar(self): """ Update the title bar """ if self.currTrack is None: self.window.set_title(consts.appName) elif self.paused: self.window.set_title('%s - %s %s' % (self.currTrack.getArtist(), self.currTrack.getTitle(), _('[paused]'))) else: self.window.set_title('%s - %s' % (self.currTrack.getArtist(), self.currTrack.getTitle())) def __updateStatusbar(self): """ Update the status bar """ # Tracklist count = len(self.tracklist) if count == 0: self.status1.set_label('') else: self.status1.set_label(ngettext('One track in playlist [%(length)s]', '%(count)u tracks in playlist [%(length)s]', count) \ % {'count': count, 'length': tools.sec2str(self.playtime)}) # Selected tracks count = len(self.selTracks) if count == 0: self.status2.set_label('') else: selection = ngettext('One track selected', '%(count)u tracks selected', count) % {'count': count} audioType = self.selTracks[0].getType() for track in self.selTracks[1:]: if track.getType() != audioType: audioType = _('various') break bitrate = self.selTracks[0].getBitrate() for track in self.selTracks[1:]: if track.getBitrate() != bitrate: bitrate = _('various') break self.status2.set_label(_('%(selection)s (Type: %(type)s, Bitrate: %(bitrate)s)') % {'selection': selection, 'type': audioType, 'bitrate': bitrate}) # --== Message handlers ==-- def onAppStarted(self): """ Real initialization function, called when this module has been loaded """ self.window = prefs.getWidgetsTree().get_widget('win-main') self.status1 = prefs.getWidgetsTree().get_widget('lbl-status1') self.status2 = prefs.getWidgetsTree().get_widget('lbl-status2') # Current player status self.paused = False self.playtime = 0 self.tracklist = [] self.selTracks = [] self.currTrack = None def onNewTrack(self, track): """ A new track is being played """ self.paused = False self.currTrack = track self.__updateTitlebar() def onPaused(self): """ Playback has been paused """ self.paused = True self.__updateTitlebar() def onUnpaused(self): """ Playback has been unpaused """ self.paused = False self.__updateTitlebar() def onStopped(self): """ Playback has been stopped """ self.paused = False self.currTrack = None self.__updateTitlebar() def onNewTracklist(self, tracks, playtime): """ A new tracklist has been set """ self.playtime = playtime self.tracklist = tracks self.__updateStatusbar() def onNewSelection(self, tracks): """ A new set of track has been selected """ self.selTracks = tracks self.__updateStatusbar() ./decibel-audio-player-1.06/src/modules/GSTPlayer.py0000644000175000017500000001663311456551413022420 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, modules from time import time from tools import consts, prefs from media import audioplayer MOD_INFO = ('GStreamer Player', 'GStreamer Player', '', [], True, False, consts.MODCAT_NONE) MIN_PLAYBACK_DELAY = 1.5 class GSTPlayer(modules.Module): """ This module is the 'real' GStreamer player """ def __init__(self): """ Constructor """ # The player must be created during the application startup, not when the application is ready (MSG_EVT_APP_STARTED) self.player = audioplayer.AudioPlayer(self.__onTrackEnded, not prefs.getCmdLine()[0].playbin) handlers = { consts.MSG_CMD_STEP: self.onStep, consts.MSG_CMD_STOP: self.onStop, consts.MSG_CMD_PLAY: self.onPlay, consts.MSG_CMD_SEEK: self.onSeek, consts.MSG_CMD_BUFFER: self.onBuffer, consts.MSG_CMD_ENABLE_RG: self.onEnableReplayGain, consts.MSG_CMD_ENABLE_EQZ: self.onEnableEqualizer, consts.MSG_CMD_SET_VOLUME: self.onSetVolume, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_CMD_SET_CD_SPEED: self.onSetCDSpeed, consts.MSG_CMD_TOGGLE_PAUSE: self.onTogglePause, consts.MSG_CMD_SET_EQZ_LVLS: self.onSetEqualizerLevels, } modules.Module.__init__(self, handlers) def updateTimerHandler(self): """ Regularly called during playback (can be paused) """ if self.player.isPlaying(): position = self.player.getPosition() remaining = self.player.getDuration() - position modules.postMsg(consts.MSG_EVT_TRACK_POSITION, {'seconds': int(position / 1000000000)}) if remaining < 5000000000 and self.nextURI is None and not prefs.getCmdLine()[0].playbin: modules.postMsg(consts.MSG_EVT_NEED_BUFFER) return True def __startUpdateTimer(self): """ Start the update timer if needed """ if self.updateTimer is None: self.updateTimer = gobject.timeout_add(1000, self.updateTimerHandler) def __stopUpdateTimer(self): """ Start the update timer if needed """ if self.updateTimer is not None: gobject.source_remove(self.updateTimer) self.updateTimer = None def onBuffer(self, uri): """ Buffer the next track """ if not prefs.getCmdLine()[0].playbin: self.nextURI = uri self.player.setNextURI(uri) def __onTrackEnded(self, error): """ Called to signal eos and errors """ self.nextURI = None if error: modules.postMsg(consts.MSG_EVT_TRACK_ENDED_ERROR) else: modules.postMsg(consts.MSG_EVT_TRACK_ENDED_OK) def __playbackTimerHandler(self): """ Switch the player to playback mode, and start the update timer """ if not self.player.isPlaying(): self.player.play() self.nextURI = None self.lastPlayback = time() self.playbackTimer = None self.__startUpdateTimer() return False # --== Message handlers ==-- def onAppStarted(self): """ This is the real initialization function, called when this module has been loaded """ self.nextURI = None self.queuedSeek = None self.updateTimer = None self.lastPlayback = 0 self.playbackTimer = None def onPlay(self, uri): """ Play the given URI """ if uri != self.nextURI: self.player.stop() self.player.setURI(uri) self.__stopUpdateTimer() elapsed = time() - self.lastPlayback # Looks like GStreamer can be pretty much fucked if we start/stop the pipeline too quickly (e.g., when clicking "next" very fast) # We minimize the load in these extreme cases by ensuring that at least one second has elapsed since the last playback # Note that this delay is avoided when tracks are chained, since the playback of the next track has then already started (uri == self.nextURI) if elapsed >= MIN_PLAYBACK_DELAY: self.__playbackTimerHandler() else: if self.playbackTimer is not None: gobject.source_remove(self.playbackTimer) self.playbackTimer = gobject.timeout_add(int((MIN_PLAYBACK_DELAY - elapsed) * 1000), self.__playbackTimerHandler) def onStop(self): """ Stop playing """ self.__stopUpdateTimer() self.player.stop() self.nextURI = None if self.playbackTimer is not None: gobject.source_remove(self.playbackTimer) modules.postMsg(consts.MSG_EVT_STOPPED) def onTogglePause(self): """ Switch between play/pause """ if self.player.isPaused(): if self.queuedSeek is not None: self.player.seek(self.queuedSeek*1000000000) self.queuedSeek = None self.player.play() modules.postMsg(consts.MSG_EVT_UNPAUSED) elif self.player.isPlaying(): if self.playbackTimer is not None: gobject.source_remove(self.playbackTimer) self.player.pause() modules.postMsg(consts.MSG_EVT_PAUSED) def onSeek(self, seconds): """ Jump to the given position if playing, or buffer it if paused """ if self.player.isPaused(): self.queuedSeek = seconds elif self.player.isPlaying(): self.player.seek(seconds*1000000000) def onStep(self, seconds): """ Step back or forth """ if self.player.isPlaying(): newPos = self.player.getPosition() + (seconds * 1000000000) if newPos < 0: self.player.seek(0) self.updateTimerHandler() elif newPos < self.player.getDuration(): self.player.seek(newPos) self.updateTimerHandler() def onSetVolume(self, value): """ Change the volume """ self.player.setVolume(value) modules.postMsg(consts.MSG_EVT_VOLUME_CHANGED, {'value': value}) def onEnableReplayGain(self): """ Enable replay gain """ self.player.enableReplayGain() def onEnableEqualizer(self): """ Enable the equalizer """ self.player.enableEqualizer() def onSetEqualizerLevels(self, lvls): """ Set the equalizer levels """ self.player.setEqualizerLvls(lvls) def onSetCDSpeed(self, speed): """ Set the CD read speed """ self.player.setCDReadSpeed(speed) ./decibel-audio-player-1.06/src/modules/GnomeMediaKeys.py0000644000175000017500000000632511456551413023444 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import dbus, modules, traceback from time import time from tools import consts, log MOD_INFO = ('Gnome Media Keys', 'Gnome Media Keys', '', [], True, False, consts.MODCAT_NONE) # Generate a 'unique' application name so that multiple instances won't interfere with each other APP_UID = consts.appName + str(time()) class GnomeMediaKeys(modules.Module): """ Support for Gnome multimedia keys """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onAppQuit, consts.MSG_EVT_APP_STARTED: self.onAppStarted, } modules.Module.__init__(self, handlers) def onMediaKey(self, appName, action): """ A media key has been pressed """ if action == 'Stop': modules.postMsg(consts.MSG_CMD_STOP) elif action == 'Next': modules.postMsg(consts.MSG_CMD_NEXT) elif action == 'Previous': modules.postMsg(consts.MSG_CMD_PREVIOUS) elif action in ['Play', 'Pause']: modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE) # --== Message handlers ==-- def onAppStarted(self): """ The application has started """ # Try first with the new interface (Gnome >= 2.2) try: service = dbus.SessionBus().get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/MediaKeys') self.dbusInterface = dbus.Interface(service, 'org.gnome.SettingsDaemon.MediaKeys') self.dbusInterface.GrabMediaPlayerKeys(APP_UID, time()) self.dbusInterface.connect_to_signal('MediaPlayerKeyPressed', self.onMediaKey) except: # If it didn't work, try the old way try: service = dbus.SessionBus().get_object('org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon') self.dbusInterface = dbus.Interface(service, 'org.gnome.SettingsDaemon') self.dbusInterface.GrabMediaPlayerKeys(APP_UID, time()) self.dbusInterface.connect_to_signal('MediaPlayerKeyPressed', self.onMediaKey) except: log.logger.error('[%s] Error while initializing\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) self.dbusInterface = None def onAppQuit(self): """ The application is about to terminate """ if self.dbusInterface is not None: self.dbusInterface.ReleaseMediaPlayerKeys(APP_UID) ./decibel-audio-player-1.06/src/modules/StatusIcon.py0000644000175000017500000002310111456551413022666 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, modules from tools import consts, loadGladeFile, prefs from gettext import gettext as _ MOD_INFO = ('Status Icon', _('Status Icon'), _('Add an icon to the notification area'), [], False, False, consts.MODCAT_DESKTOP) class StatusIcon(modules.Module): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_TRACK_MOVED: self.onTrackMoved, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, consts.MSG_EVT_NEW_TRACKLIST: self.onNewTracklist, consts.MSG_EVT_VOLUME_CHANGED: self.onVolumeChanged, } modules.Module.__init__(self, handlers) def renderIcons(self, statusIcon, availableSize): """ (Re) Create icons based the available tray size """ # Normal icon if availableSize >= 48+2: self.icoNormal = gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon48) elif availableSize >= 32+2: self.icoNormal = gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon32) elif availableSize >= 24+2: self.icoNormal = gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon24) else: self.icoNormal = gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon16) # Paused icon self.icoPause = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, self.icoNormal.get_width(), self.icoNormal.get_height()) self.icoPause.fill(0x00000000) self.icoNormal.composite(self.icoPause, 0, 0, self.icoNormal.get_width(), self.icoNormal.get_height(), 0, 0, 1, 1, gtk.gdk.INTERP_HYPER, 100) if self.icoNormal.get_width() == 16: pauseStock = self.mainWindow.render_icon(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU) else: pauseStock = self.mainWindow.render_icon(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_BUTTON) diffX = self.icoPause.get_width() - pauseStock.get_width() diffY = self.icoPause.get_height() - pauseStock.get_height() pauseStock.composite(self.icoPause, 0, 0, pauseStock.get_width(), pauseStock.get_height(), diffX/2, diffY/2, 1, 1, gtk.gdk.INTERP_HYPER, 255) # Use the correct icon if self.isPaused: statusIcon.set_from_pixbuf(self.icoPause) else: statusIcon.set_from_pixbuf(self.icoNormal) def toggleWinVisibility(self, statusIcon): """ Show/hide the main window """ if not self.isMainWinVisible: self.mainWindow.show() self.isMainWinVisible = True elif self.mainWindow.has_toplevel_focus(): self.mainWindow.hide() self.isMainWinVisible = False else: self.mainWindow.hide() self.mainWindow.show() # --== Message handlers ==-- def onModLoaded(self): """ Install the Status icon """ self.volume = 0 self.tooltip = consts.appName self.isPaused = False self.icoPause = None self.popupMenu = None self.isPlaying = False self.icoNormal = None self.mainWindow = prefs.getWidgetsTree().get_widget('win-main') self.trackHasNext = False self.trackHasPrev = False self.emptyTracklist = True self.isMainWinVisible = True # The status icon does not support RGBA, so make sure to use the RGB color map when creating it gtk.widget_push_colormap(self.mainWindow.get_screen().get_rgb_colormap()) self.statusIcon = gtk.StatusIcon() gtk.widget_pop_colormap() # GTK+ handlers self.statusIcon.connect('activate', self.toggleWinVisibility) self.statusIcon.connect('popup-menu', self.onPopupMenu) self.statusIcon.connect('size-changed', self.renderIcons) self.statusIcon.connect('scroll-event', self.onScroll) self.statusIcon.connect('button-press-event', self.onButtonPressed) # Install everything self.statusIcon.set_tooltip(consts.appName) self.onNewTrack(None) self.statusIcon.set_visible(True) def onModUnloaded(self): """ Uninstall the Status icon """ self.statusIcon.set_visible(False) self.statusIcon = None if not self.isMainWinVisible: self.mainWindow.show() self.isMainWinVisible = True def onNewTrack(self, track): """ A new track is being played, None if none """ if track is None: self.tooltip = consts.appName else: self.tooltip = '%s - %s' % (track.getArtist(), track.getTitle()) self.isPaused = False self.isPlaying = track is not None self.statusIcon.set_from_pixbuf(self.icoNormal) self.statusIcon.set_tooltip(self.tooltip) def onPaused(self): """ The current track has been paused """ self.isPaused = True self.statusIcon.set_from_pixbuf(self.icoPause) self.statusIcon.set_tooltip(_('%(tooltip)s [paused]') % {'tooltip': self.tooltip}) def onUnpaused(self): """ The current track has been unpaused """ self.isPaused = False self.statusIcon.set_from_pixbuf(self.icoNormal) self.statusIcon.set_tooltip(self.tooltip) def onTrackMoved(self, hasPrevious, hasNext): """ The position of the current track in the playlist has changed """ self.trackHasNext = hasNext self.trackHasPrev = hasPrevious def onVolumeChanged(self, value): """ The volume has changed """ self.volume = value def onNewTracklist(self, tracks, playtime): """ A new tracklist has been defined """ if len(tracks) == 0: self.emptyTracklist = True else: self.emptyTracklist = False def onStopped(self): """ The playback has been stopped """ self.onNewTrack(None) # --== GTK handlers ==-- def onPopupMenu(self, statusIcon, button, time): """ The user asks for the popup menu """ if self.popupMenu is None: wTree = loadGladeFile('StatusIconMenu.glade') self.menuPlay = wTree.get_widget('item-play') self.menuStop = wTree.get_widget('item-stop') self.menuNext = wTree.get_widget('item-next') self.popupMenu = wTree.get_widget('menu-popup') self.menuPause = wTree.get_widget('item-pause') self.menuPrevious = wTree.get_widget('item-previous') self.menuSeparator = wTree.get_widget('item-separator') # Connect handlers wTree.get_widget('item-quit').connect('activate', lambda btn: modules.postQuitMsg()) wTree.get_widget('item-preferences').connect('activate', lambda btn: modules.showPreferences()) self.menuPlay.connect('activate', lambda btn: modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE)) self.menuStop.connect('activate', lambda btn: modules.postMsg(consts.MSG_CMD_STOP)) self.menuNext.connect('activate', lambda btn: modules.postMsg(consts.MSG_CMD_NEXT)) self.menuPrevious.connect('activate', lambda btn: modules.postMsg(consts.MSG_CMD_PREVIOUS)) self.menuPause.connect('activate', lambda btn: modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE)) self.popupMenu.show_all() # Enable only relevant menu entries self.menuStop.set_sensitive(self.isPlaying) self.menuNext.set_sensitive(self.isPlaying and self.trackHasNext) self.menuPause.set_sensitive(self.isPlaying and not self.isPaused) self.menuPrevious.set_sensitive(self.isPlaying and self.trackHasPrev) self.menuPlay.set_sensitive((not (self.isPlaying or self.emptyTracklist)) or self.isPaused) self.popupMenu.popup(None, None, gtk.status_icon_position_menu, button, time, statusIcon) def onScroll(self, statusIcon, scrollEvent): """ The mouse is scrolled on the status icon """ if scrollEvent.direction == gtk.gdk.SCROLL_UP or scrollEvent.direction == gtk.gdk.SCROLL_RIGHT: self.volume = min(1.0, self.volume + 0.05) else: self.volume = max(0.0, self.volume - 0.05) modules.postMsg(consts.MSG_CMD_SET_VOLUME, {'value': self.volume}) def onButtonPressed(self, statusIcon, buttonEvent): """ A button is pressed on the status icon """ if buttonEvent.button == 2: modules.postMsg(consts.MSG_CMD_TOGGLE_PAUSE) ./decibel-audio-player-1.06/src/modules/DBus.py0000644000175000017500000003420711456551413021440 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import dbus, dbus.service, gobject, media, modules, traceback from tools import consts, log MOD_INFO = ('D-Bus Support', 'D-Bus Support', '', [], True, False, consts.MODCAT_NONE) # MPRIS caps constants CAPS_CAN_GO_NEXT = 1 CAPS_CAN_GO_PREV = 2 CAPS_CAN_PAUSE = 4 CAPS_CAN_PLAY = 8 CAPS_CAN_SEEK = 16 CAPS_CAN_PROVIDE_METADATA = 32 CAPS_CAN_HAS_TRACKLIST = 64 class DBus(modules.Module): """ Enable D-Bus support """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_TRACK_MOVED: self.onCurrentTrackMoved, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_NEW_TRACKLIST: self.onNewTracklist, consts.MSG_EVT_VOLUME_CHANGED: self.onVolumeChanged, consts.MSG_EVT_TRACK_POSITION: self.onNewTrackPosition, consts.MSG_EVT_REPEAT_CHANGED: self.onRepeatChanged, } modules.Module.__init__(self, handlers) def getMPRISCaps(self): """ Return an integer sticking to the MPRIS caps definition """ caps = CAPS_CAN_HAS_TRACKLIST if len(self.tracklist) != 0: caps |= CAPS_CAN_PLAY if self.currTrack is not None: caps |= CAPS_CAN_PAUSE caps |= CAPS_CAN_SEEK caps |= CAPS_CAN_PROVIDE_METADATA if self.canGoNext: caps |= CAPS_CAN_GO_NEXT if self.canGoPrev: caps |= CAPS_CAN_GO_PREV return caps def getMPRISStatus(self): """ Return a tuple sticking to the MPRIS status definition """ if self.currTrack is None: playStatus = 2 elif self.paused: playStatus = 1 else: playStatus = 0 if self.repeat: repeatStatus = 1 else: repeatStatus = 0 return (playStatus, 0, 0, repeatStatus) # --== Message handlers ==-- def onAppStarted(self): """ Initialize this module """ self.repeat = False self.paused = False self.tracklist = [] self.currTrack = None self.canGoNext = False self.canGoPrev = False self.currVolume = 0 self.currPosition = 0 try: self.sessionBus = dbus.SessionBus() self.busName = dbus.service.BusName(consts.dbusService, bus=self.sessionBus) # Create the three MPRIS objects self.busObjectRoot = DBusObjectRoot(self.busName, self) self.busObjectPlayer = DBusObjectPlayer(self.busName, self) self.busObjectTracklist = DBusObjectTracklist(self.busName, self) except: self.sessionBus = None log.logger.error('[%s] Error while initializing\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) def onNewTrack(self, track): """ A new track is being played """ self.paused = False self.currTrack = track self.busObjectPlayer.CapsChange(self.getMPRISCaps()) self.busObjectPlayer.TrackChange(track.getMPRISMetadata()) self.busObjectPlayer.StatusChange(self.getMPRISStatus()) def onStopped(self): """ Playback is stopped """ self.paused = False self.currTrack = None self.currPosition = 0 self.busObjectPlayer.CapsChange(self.getMPRISCaps()) self.busObjectPlayer.StatusChange(self.getMPRISStatus()) def onVolumeChanged(self, value): """ The volume has been changed """ self.currVolume = value def onNewTrackPosition(self, seconds): """ New position in the current track """ self.currPosition = seconds def onPaused(self): """ The playback has been paused """ self.paused = True self.busObjectPlayer.StatusChange(self.getMPRISStatus()) def onUnpaused(self): """ The playback has been unpaused """ self.paused = False self.busObjectPlayer.StatusChange(self.getMPRISStatus()) def onNewTracklist(self, tracks, playtime): """ A new tracklist has been set """ self.tracklist = tracks self.busObjectPlayer.CapsChange(self.getMPRISCaps()) self.busObjectTracklist.TrackListChange(len(tracks)) def onCurrentTrackMoved(self, hasNext, hasPrevious): """ The position of the current track has moved in the playlist """ self.canGoNext = hasNext self.canGoPrev = hasPrevious self.busObjectPlayer.CapsChange(self.getMPRISCaps()) def onRepeatChanged(self, repeat): """ Repeat has been enabled/disabled """ self.repeat = repeat self.busObjectPlayer.StatusChange(self.getMPRISStatus()) class DBusObjectRoot(dbus.service.Object): def __init__(self, busName, module): """ Constructor """ dbus.service.Object.__init__(self, busName, '/') @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='s') def Identity(self): """ Returns a string containing the media player identification """ return '%s %s' % (consts.appName, consts.appVersion) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Quit(self): """ Makes the media player exit """ modules.postQuitMsg() @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='(qq)') def MprisVersion(self): """ Returns a struct that represents the version of the MPRIS spec being implemented """ return (1, 0) class DBusObjectTracklist(dbus.service.Object): def __init__(self, busName, module): """ Constructor """ self.module = module dbus.service.Object.__init__(self, busName, '/TrackList') @dbus.service.method(consts.dbusInterface, in_signature='i', out_signature='a{sv}') def GetMetadata(self, idx): """ Gives all meta data available for element at given position in the TrackList, counting from 0 """ if idx >= 0 and idx < len(self.module.tracklist): return self.module.tracklist[idx].getMPRISMetadata() else: return {} @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='i') def GetCurrentTrack(self): """ Return the position of current URI in the TrackList """ if self.module.currTrack is None: return -1 else: return self.module.currTrack.getPlaylistPos()-1 @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='i') def GetLength(self): """ Number of elements in the TrackList """ return len(self.module.tracklist) @dbus.service.method(consts.dbusInterface, in_signature='sb', out_signature='i') def AddTrack(self, uri, playNow): """ Appends an URI to the TrackList """ import urllib decodedURI = urllib.unquote(uri) if decodedURI.startswith('file://'): gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_ADD, {'tracks': [media.getTrackFromFile(decodedURI[7:])], 'playNow': playNow}) return 0 return 1 @dbus.service.method(consts.dbusInterface, in_signature='i', out_signature='') def DelTrack(self, idx): """ Removes an URI from the TrackList """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_DEL, {'idx': idx}) @dbus.service.method(consts.dbusInterface, in_signature='b', out_signature='') def SetLoop(self, loop): """ Toggle playlist loop """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_REPEAT, {'repeat': loop}) @dbus.service.method(consts.dbusInterface, in_signature='b', out_signature='') def SetRandom(self, random): """ Toggle playlist shuffle / random """ if random: gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_SHUFFLE) @dbus.service.signal(consts.dbusInterface, signature='i') def TrackListChange(self, length): """ Signal is emitted when the tracklist content has changed """ pass # These functions are not part of the MPRIS, but are useful @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Clear(self): """ Clear the tracklist """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_CLR) @dbus.service.method(consts.dbusInterface, in_signature='asb', out_signature='') def AddTracks(self, uris, playNow): """ Appends multiple URIs to the tracklist """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_ADD, {'tracks': media.getTracks([file for file in uris]), 'playNow': playNow}) @dbus.service.method(consts.dbusInterface, in_signature='asb', out_signature='') def SetTracks(self, uris, playNow): """ Replace the tracklist by the given URIs """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TRACKLIST_SET, {'tracks': media.getTracks([file for file in uris]), 'playNow': playNow}) class DBusObjectPlayer(dbus.service.Object): def __init__(self, busName, module): """ Constructor """ self.module = module dbus.service.Object.__init__(self, busName, '/Player') @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Next(self): """ Goes to the next element """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_NEXT) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Prev(self): """ Goes to the previous element """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_PREVIOUS) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Pause(self): """ If playing : pause. If paused : unpause """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_TOGGLE_PAUSE) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Stop(self): """ Stop playing """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_STOP) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='') def Play(self): """ If playing : rewind to the beginning of current track, else : start playing """ if len(self.module.tracklist) != 0: if self.module.currTrack is None: gobject.idle_add(modules.postMsg, consts.MSG_CMD_TOGGLE_PAUSE) else: gobject.idle_add(modules.postMsg, consts.MSG_CMD_SEEK, {'seconds': 0}) @dbus.service.method(consts.dbusInterface, in_signature='b', out_signature='') def Repeat(self, repeat): """ Toggle the current track repeat """ # We don't support repeating only the current track pass @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='(iiii)') def GetStatus(self): """ Return the status of media player as a struct of 4 ints """ return self.module.getMPRISStatus() @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='a{sv}') def GetMetadata(self): """ Gives all meta data available for the currently played element """ if self.module.currTrack is None: return {} else: return self.module.currTrack.getMPRISMetadata() @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='i') def GetCaps(self): """ Return the media player's current capabilities """ return self.module.getMPRISCaps() @dbus.service.method(consts.dbusInterface, in_signature='i', out_signature='') def VolumeSet(self, volume): """ Sets the volume (argument must be in [0;100]) """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_SET_VOLUME, {'value': volume / 100.0}) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='i') def VolumeGet(self): """ Returns the current volume (must be in [0;100]) """ return self.module.currVolume * 100 @dbus.service.method(consts.dbusInterface, in_signature='i', out_signature='') def PositionSet(self, position): """ Sets the playing position (argument must be in [0;] in milliseconds) """ gobject.idle_add(modules.postMsg, consts.MSG_CMD_SEEK, {'seconds': position / 1000}) @dbus.service.method(consts.dbusInterface, in_signature='', out_signature='i') def PositionGet(self): """ Returns the playing position (will be [0;] in milliseconds) """ return self.module.currPosition * 1000 @dbus.service.signal(consts.dbusInterface, signature='a{sv}') def TrackChange(self, metadata): """ Signal is emitted when the media player plays another track """ pass @dbus.service.signal(consts.dbusInterface, signature='(iiii)') def StatusChange(self, status): """ Signal is emitted when the status of the media player change """ pass @dbus.service.signal(consts.dbusInterface, signature='i') def CapsChange(self, caps): """ Signal is emitted when the media player changes capabilities """ pass ./decibel-audio-player-1.06/src/modules/Explorer.py0000644000175000017500000001615011456551413022400 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, modules from tools import consts, icons, prefs from gettext import gettext as _ MOD_INFO = ('Explorer', 'Explorer', '', [], True, False, consts.MODCAT_NONE) DEFAULT_LAST_EXPLORER = ('', '') # Module name and explorer name # The rows in the combo box ( ROW_PIXBUF, # Icon displayed in front of the entry ROW_NAME, # Name of the entry ROW_MODULE, # Name of the module the entry is associated to ROW_PAGE_NUM, # Number of the notebook page the entry is associated to ROW_IS_HEADER, # True if the entry is an header (used to separate different modules) ) = range(5) class Explorer(modules.Module): """ This module manages the left part of the GUI, with all the exploration stuff """ def __init__(self): """ Constructor """ modules.Module.__init__(self, { consts.MSG_CMD_EXPLORER_ADD: self.onAddExplorer, consts.MSG_CMD_EXPLORER_REMOVE: self.onRemoveExplorer, consts.MSG_CMD_EXPLORER_RENAME: self.onRenameExplorer, }) # Attributes self.store = gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_INT, gobject.TYPE_BOOLEAN) self.combo = prefs.getWidgetsTree().get_widget('combo-explorer') txtRenderer = gtk.CellRendererText() pixRenderer = gtk.CellRendererPixbuf() self.timeout = None self.notebook = prefs.getWidgetsTree().get_widget('notebook-explorer') self.allExplorers = {} self.notebookPages = {} self.currExplorerIdx = 0 # Setup the combo box txtRenderer.set_property('xpad', 6) self.combo.pack_start(pixRenderer, False) self.combo.add_attribute(pixRenderer, 'pixbuf', ROW_PIXBUF) self.combo.pack_start(txtRenderer, True) self.combo.add_attribute(txtRenderer, 'markup', ROW_NAME) self.combo.set_sensitive(False) self.combo.set_cell_data_func(txtRenderer, self.__cellDataFunction) self.combo.set_model(self.store) # Setup the notebook label = gtk.Label(_('Please select an explorer\nin the combo box below.')) label.show() self.notebook.append_page(label) # GTK handlers self.combo.connect('changed', self.onChanged) def __cellDataFunction(self, combo, renderer, model, iter): """ Use a different format for headers """ if model.get_value(iter, ROW_IS_HEADER): renderer.set_property('xalign', 0.5) else: renderer.set_property('xalign', 0.0) def __fillComboBox(self): """ Fill the combo box """ idx = self.combo.get_active() restoredIdx = None self.timeout = None previousModule = None if idx == -1: selectedModule, selectedExplorer = prefs.get(__name__, 'last-explorer', DEFAULT_LAST_EXPLORER) else: selectedModule, selectedExplorer = self.store[idx][ROW_MODULE], self.store[idx][ROW_NAME] self.combo.freeze_child_notify() self.store.clear() for (module, explorer), (pixbuf, widget) in sorted(self.allExplorers.iteritems()): if module != previousModule: self.store.append((None, '%s' % module, '', -1, True)) previousModule = module self.store.append((pixbuf, explorer, module, self.notebookPages[widget], False)) if module == selectedModule and explorer == selectedExplorer: restoredIdx = len(self.store) - 1 if restoredIdx is None: self.currExplorerIdx = 0 self.notebook.set_current_page(0) else: self.combo.set_active(restoredIdx) self.combo.set_sensitive(len(self.store) != 0) self.combo.thaw_child_notify() return False def fillComboBox(self): """ Wrapper function for __fillComboBox() Call fillComboBox() after a small timeout, to avoid many (useless) consecutive calls to __fillComboBox() """ if self.timeout is not None: gobject.source_remove(self.timeout) self.timeout = gobject.timeout_add(100, self.__fillComboBox) # --== Message handlers ==-- def onAddExplorer(self, modName, expName, icon, widget): """ Add a new explorer to the combo box """ if widget not in self.notebookPages: self.notebookPages[widget] = self.notebook.append_page(widget) self.allExplorers[(modName, expName)] = (icon, widget) self.fillComboBox() def onRemoveExplorer(self, modName, expName): """ Remove an existing explorer from the combo box """ del self.allExplorers[(modName, expName)] self.fillComboBox() def onRenameExplorer(self, modName, expName, newExpName): """ Rename the given explorer """ if newExpName != expName: self.allExplorers[(modName, newExpName)] = self.allExplorers[(modName, expName)] del self.allExplorers[(modName, expName)] # If the explorer we're renaming is currently selected, we need to rename the row # Otherwise, fillComboBox() won't be able to keep it selected idx = self.combo.get_active() if idx != -1 and self.store[idx][ROW_MODULE] == modName and self.store[idx][ROW_NAME] == expName: self.store[idx][ROW_NAME] = newExpName prefs.set(__name__, 'last-explorer', (modName, newExpName)) self.fillComboBox() # --== GTK handlers ==-- def onChanged(self, combo): """ A new explorer has been selected with the combo box """ idx = combo.get_active() if idx == -1: self.notebook.set_current_page(0) elif self.store[idx][ROW_IS_HEADER]: combo.set_active(self.currExplorerIdx) else: self.currExplorerIdx = idx prefs.set(__name__, 'last-explorer', (self.store[idx][ROW_MODULE], self.store[idx][ROW_NAME])) modules.postMsg(consts.MSG_EVT_EXPLORER_CHANGED, {'modName': self.store[idx][ROW_MODULE], 'expName': self.store[idx][ROW_NAME]}) self.notebook.set_current_page(self.store[idx][ROW_PAGE_NUM]) ./decibel-audio-player-1.06/src/modules/Zeitgeist.py0000644000175000017500000000626111456551413022551 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Authors: Ingelrest François (Francois.Ingelrest@gmail.com), # Jendrik Seipp (jendrikseipp@web.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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules, traceback from tools import consts from gettext import gettext as _ from tools.log import logger MOD_INFO = ('Zeitgeist', 'Zeitgeist', _('Send track information to the Zeitgeist service'), ['zeitgeist'], False, False, consts.MODCAT_DESKTOP) class Zeitgeist(modules.ThreadedModule): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onModUnloaded, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, } modules.ThreadedModule.__init__(self, handlers) # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ self.client = None try: from zeitgeist.client import ZeitgeistClient self.client = ZeitgeistClient() except: logger.info('[%s] Could not create Zeitgeist client\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) def onModUnloaded(self): """ The module has been unloaded """ self.client = None def onNewTrack(self, track): """ Send track information to Zeitgeist """ import mimetypes, os.path from zeitgeist.datamodel import Event, Subject, Interpretation, Manifestation mime, encoding = mimetypes.guess_type(track.getFilePath(), strict=False) subject = Subject.new_for_values( uri = os.path.dirname(track.getURI()), text = track.getTitle() + ' - ' + track.getArtist() + ' - ' + track.getExtendedAlbum(), mimetype = mime, manifestation = unicode(Manifestation.FILE), interpretation = unicode(Interpretation.AUDIO), ) if hasattr(Interpretation, 'ACCESS_EVENT'): eventType = Interpretation.ACCESS_EVENT else: eventType = Interpretation.OPEN_EVENT event = Event.new_for_values( actor = "application://decibel-audio-player.desktop", subjects = [subject,], interpretation = eventType, ) self.client.insert_event(event) ./decibel-audio-player-1.06/src/modules/StatusFile.py0000644000175000017500000001211011456551413022653 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gui, modules, os.path from media import track from tools import consts, prefs from gettext import gettext as _ MOD_INFO = ('Status File', _('Status File'), _('Generate a text file with the current status'), [], False, True, consts.MODCAT_DESKTOP) # Default preferences PREFS_DEFAULT_FILE = os.path.join(consts.dirCfg, 'now-playing.txt') PREFS_DEFAULT_STATUS = 'Now playing {title}\nby {artist}' class StatusFile(modules.ThreadedModule): """ Allow external programs to display the current status """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_STOPPED: self.onClearFile, consts.MSG_EVT_APP_QUIT: self.onClearFile, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_UNLOADED: self.onClearFile, } modules.ThreadedModule.__init__(self, handlers) self.cfgWindow = None def configure(self, parent): """ Show the configuration window """ if self.cfgWindow is None: self.cfgWindow = gui.window.Window('StatusFile.glade', 'vbox1', __name__, MOD_INFO[modules.MODINFO_L10N], 355, 345) self.btnOk = self.cfgWindow.getWidget('btn-ok') self.txtFile = self.cfgWindow.getWidget('txt-file') self.txtStatus = self.cfgWindow.getWidget('txt-status') # GTK handlers self.btnOk.connect('clicked', self.onOk) self.cfgWindow.getWidget('btn-help').connect('clicked', self.onHelp) self.cfgWindow.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWindow.hide()) self.cfgWindow.getWidget('btn-open').connect('clicked', self.onOpen) # Fill current preferences if not self.cfgWindow.isVisible(): self.txtFile.set_text(prefs.get(__name__, 'file', PREFS_DEFAULT_FILE)) self.txtStatus.get_buffer().set_text(prefs.get(__name__, 'status', PREFS_DEFAULT_STATUS)) self.btnOk.grab_focus() self.cfgWindow.show() def updateFile(self, track): """ Show the notification based on the given track """ output = open(prefs.get(__name__, 'file', PREFS_DEFAULT_FILE), 'w') if track is None: output.write('') else: output.write(track.format(prefs.get(__name__, 'status', PREFS_DEFAULT_STATUS))) output.close() # --== Message handlers ==-- def onNewTrack(self, track): """ A new track is being played """ self.updateFile(track) def onClearFile(self): """ Erase the contents of the file """ self.updateFile(None) # --== GTK handlers ==-- def onOk(self, btn): """ Save the new preferences """ if not os.path.isdir(os.path.dirname(self.txtFile.get_text())): gui.errorMsgBox(self.cfgWindow, _('Invalid path'), _('The path to the selected file is not valid. Please choose an existing path.')) self.txtFile.grab_focus() else: prefs.set(__name__, 'file', self.txtFile.get_text()) (start, end) = self.txtStatus.get_buffer().get_bounds() prefs.set(__name__, 'status', self.txtStatus.get_buffer().get_text(start, end)) self.cfgWindow.hide() def onOpen(self, btn): """ Let the user choose a file """ dir = os.path.dirname(self.txtFile.get_text()) file = os.path.basename(self.txtFile.get_text()) result = gui.fileChooser.save(self.cfgWindow, _('Choose a file'), file, dir) if result is not None: self.txtFile.set_text(result) def onHelp(self, btn): """ Display a small help message box """ helpDlg = gui.help.HelpDlg(MOD_INFO[modules.MODINFO_L10N]) helpDlg.addSection(_('Description'), _('This module generates a text file with regards to the track currently played.')) helpDlg.addSection(_('Customizing the File'), _('You can change the content of the file to any text you want. Before generating the file, ' 'fields of the form {field} are replaced by their corresponding value. ' 'Available fields are:\n\n') + track.getFormatSpecialFields(False)) helpDlg.show(self.cfgWindow) ./decibel-audio-player-1.06/src/modules/AudioCD.py0000644000175000017500000004531211456551413022052 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, gui, modules, os, tools, traceback from gui import extTreeview from tools import consts, icons, prefs, sec2str from gettext import gettext as _ from tools.log import logger from media.track.cdTrack import CDTrack MOD_INFO = ('Audio CD', _('Audio CD'), _('Play audio discs'), ('DiscID', 'CDDB'), False, True, consts.MODCAT_EXPLORER) MOD_L10N = MOD_INFO[modules.MODINFO_L10N] PREFS_DFT_DEVICE = '/dev/cdrom' PREFS_DFT_USE_CDDB = True PREFS_DFT_USE_CACHE = True PREFS_DFT_READ_SPEED = 1 # Format of a row in the treeview ( ROW_PIXBUF, ROW_LENGTH, ROW_NAME, ROW_TRACK ) = range(4) # All CD-ROM read speeds READ_SPEEDS = { 1 : 0, 2 : 1, 4 : 2, 8 : 3, 10 : 4, 12 : 5, 20 : 6, 32 : 7, 36 : 8, 40 : 9, 48 : 10, 50 : 11, 52 : 12, 56 : 13, 72 : 14, } # Information returned by disc_id() DISC_FRAME1 = 2 DISC_FRAMEn = -2 DISC_LENGTH = -1 DISC_CHECKSUM = 0 DISC_NB_TRACKS = 1 class AudioCD(modules.ThreadedModule): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onModUnloaded, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, consts.MSG_EVT_EXPLORER_CHANGED: self.onExplorerChanged, } modules.ThreadedModule.__init__(self, handlers) def __drawAlbumLenCell(self, column, cell, model, iter): """ Use a different background color for alphabetical headers """ if model.get_value(iter, ROW_LENGTH) is None: cell.set_property('visible', False) else: cell.set_property('visible', True) def getTracksFromPaths(self, tree, paths): """ Return a list of tracks with all the associated tags: * From the list 'paths' if it is not None * From the current selection if 'paths' is None """ if paths is None: if tree.isRowSelected((0,)): return [tree.getItem(child, ROW_TRACK) for child in tree.iterChildren((0,))] else: return [row[ROW_TRACK] for row in tree.getSelectedRows()] else: if (0,) in paths: return [tree.getItem(child, ROW_TRACK) for child in tree.iterChildren((0,))] else: return [row[ROW_TRACK] for row in tree.getRows(paths)] def playPaths(self, tree, paths, replace): """ Replace/extend the tracklist If the list 'paths' is None, use the current selection """ if self.tree.getNbChildren((0,)) != 0: tracks = self.getTracksFromPaths(tree, paths) if replace: modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': tracks, 'playNow': True}) else: modules.postMsg(consts.MSG_CMD_TRACKLIST_ADD, {'tracks': tracks, 'playNow': False}) # --== Cache management ==-- def clearCache(self): """ Clear cache content """ for file in os.listdir(self.cacheDir): os.remove(os.path.join(self.cacheDir, file)) def isDiscInCache(self, discInfo): """ Return whether the given disc is present in the cache """ return os.path.exists(os.path.join(self.cacheDir, str(discInfo[DISC_CHECKSUM]))) def getDiscFromCache(self, discInfo): """ Return CDDB information from the cache, or None if that disc is not cached """ try: return tools.pickleLoad(os.path.join(self.cacheDir, str(discInfo[DISC_CHECKSUM]))) except: return None def addDiscToCache(self, discInfo, cddb): """ Add the given CDDB information to the cache """ if not os.path.exists(self.cacheDir): os.mkdir(self.cacheDir) try: tools.pickleSave(os.path.join(self.cacheDir, str(discInfo[DISC_CHECKSUM])), cddb) except: pass # --== Gui management, these functions must be executed in the GTK main loop ==-- def createTree(self, nbTracks): """ Create a temporary explorer tree without disc information """ name = '%s %s' % (MOD_L10N, _('downloading data...')) self.tree.replaceContent(((icons.cdromMenuIcon(), None, name, None),)) # Append a child for each track self.tree.appendRows([(icons.mediaFileMenuIcon(), None, _('Track %02u') % (i+1), None) for i in xrange(nbTracks)], (0,)) self.tree.expand_all() def updateTree(self, discInfo): """ Update the tree using disc information from the cache, if any """ cddb = self.getDiscFromCache(discInfo) # Create fake CDDB information if needed if cddb is None: cddb = {'DTITLE': '%s / %s' % (consts.UNKNOWN_ARTIST, consts.UNKNOWN_ALBUM)} for i in xrange(discInfo[DISC_NB_TRACKS]): cddb['TTITLE%u' % i] = consts.UNKNOWN_TITLE # Compute the length of each track trackLen = [int(round((discInfo[DISC_FRAME1 + i + 1] - discInfo[DISC_FRAME1 + i]) / 75.0)) for i in xrange(discInfo[DISC_NB_TRACKS] - 1)] trackLen.append(discInfo[DISC_LENGTH] - int(round(discInfo[DISC_FRAMEn] / 75.0))) # Update the root of the tree disc = cddb['DTITLE'].strip().decode('iso-8859-15', 'replace') artist, album = disc.split(' / ') self.tree.setItem((0,), ROW_NAME, '%s' % tools.htmlEscape(disc)) self.tree.setItem((0,), ROW_LENGTH, '[%s]' % sec2str(sum(trackLen))) # Update the explorer name modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': self.expName, 'newExpName': disc}) self.expName = disc # Optional information try: date = int(cddb['DYEAR'].strip().decode('iso-8859-15', 'replace')) except: date = None try: genre = cddb['DGENRE'].strip().decode('iso-8859-15', 'replace') except: genre = None # Update each track for i, child in enumerate(self.tree.iterChildren((0,))): title = cddb['TTITLE%u' % i].strip().decode('iso-8859-15', 'replace') # Create the corresponding Track object track = CDTrack(str(i+1)) track.setTitle(title) track.setAlbum(album) track.setArtist(artist) track.setLength(trackLen[i]) track.setNumber(i+1) # Optional information if date is not None: track.setDate(date) if genre is not None: track.setGenre(genre) # Fill the tree self.tree.setItem(child, ROW_NAME, '%02u. %s' % (i + 1, tools.htmlEscape(title))) self.tree.setItem(child, ROW_TRACK, track) # --== Disc management ==-- def cddbRequest(self, discInfo): """ Return disc information from online CDDB, None if request fails """ import CDDB, socket # Make sure to not be blocked by the request socket.setdefaulttimeout(consts.socketTimeout) try: (status, info) = CDDB.query(discInfo) if status == 200: disc = info # Success elif status == 210: disc = info[0] # Exact multiple matches elif status == 211: disc = info[0] # Inexact multiple matches else: raise Exception, 'Unknown disc (phase 1 returned %u)' % status (status, info) = CDDB.read(disc['category'], disc['disc_id']) if status == 210: return info else: raise Exception, 'Unknown disc (phase 2 returned %u)' % status except: logger.error('[%s] CDDB request failed\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) return None def loadDisc(self): """ Read disc information and create the explorer tree accordingly """ import DiscID try: discInfo = DiscID.disc_id(DiscID.open(prefs.get(__name__, 'device', PREFS_DFT_DEVICE))) except Exception, err: if err[0] == 123: self.tree.replaceContent([(icons.cdromMenuIcon(), None, _('No disc found'), None)]) modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': self.expName, 'newExpName': MOD_L10N}) self.expName = MOD_L10N else: logger.error('[%s] Unable to read device\n\n%s' % (MOD_INFO[modules.MODINFO_NAME], traceback.format_exc())) return # Create a temporary tree, download CDDB information if needed, and update the tree gobject.idle_add(self.createTree, discInfo[DISC_NB_TRACKS]) if not self.isDiscInCache(discInfo) and prefs.get(__name__, 'use-cddb', PREFS_DFT_USE_CDDB): cddb = self.cddbRequest(discInfo) if cddb is not None: self.addDiscToCache(discInfo, cddb) gobject.idle_add(self.updateTree, discInfo) def reloadDisc(self): """ Reload the disc """ # Make sure the reload is done in the thread's code and not in the GTK main loop self.threadExecute(self.loadDisc) # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ txtRdrLen = gtk.CellRendererText() columns = (('', [(gtk.CellRendererPixbuf(), gtk.gdk.Pixbuf), (txtRdrLen, gobject.TYPE_STRING), (gtk.CellRendererText(), gobject.TYPE_STRING)], True), (None, [(None, gobject.TYPE_PYOBJECT)], False)) self.tree = extTreeview.ExtTreeView(columns, True) self.popup = None self.cfgWin = None self.expName = MOD_L10N self.scrolled = gtk.ScrolledWindow() self.cacheDir = os.path.join(consts.dirCfg, MOD_INFO[modules.MODINFO_NAME]) # The album length is written in a smaller font, with a lighter color txtRdrLen.set_property('scale', 0.85) txtRdrLen.set_property('foreground-gdk', self.tree.get_style().text[gtk.STATE_INSENSITIVE]) # Explorer self.tree.setDNDSources([consts.DND_TARGETS[consts.DND_DAP_TRACKS]]) self.scrolled.add(self.tree) self.scrolled.set_shadow_type(gtk.SHADOW_IN) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.show() # GTK handlers self.tree.connect('drag-data-get', self.onDragDataGet) self.tree.connect('key-press-event', self.onKeyPressed) self.tree.connect('exttreeview-button-pressed', self.onButtonPressed) modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': self.expName, 'icon': icons.cdromMenuIcon(), 'widget': self.scrolled}) # Hide the album length when not drawing the root node self.tree.get_column(0).set_cell_data_func(txtRdrLen, self.__drawAlbumLenCell) # CD-ROM drive read speed modules.postMsg(consts.MSG_CMD_SET_CD_SPEED, {'speed': prefs.get(__name__, 'read-speed', PREFS_DFT_READ_SPEED)}) def onModUnloaded(self): """ The module is going to be unloaded """ modules.postMsg(consts.MSG_CMD_EXPLORER_REMOVE, {'modName': MOD_L10N, 'expName': self.expName}) if not prefs.get(__name__, 'use-cache', PREFS_DFT_USE_CACHE): self.clearCache() def onExplorerChanged(self, modName, expName): """ A new explorer has been selected """ if modName == MOD_L10N: self.loadDisc() # --== GTK handlers ==-- def onDragDataGet(self, tree, context, selection, info, time): """ Provide information about the data being dragged """ serializedTracks = '\n'.join([track.serialize() for track in self.getTracksFromPaths(tree, None)]) selection.set(consts.DND_TARGETS[consts.DND_DAP_TRACKS][0], 8, serializedTracks) def onShowPopupMenu(self, tree, button, time, path): """ Show a popup menu """ popup = gtk.Menu() # Play selection play = gtk.ImageMenuItem(gtk.STOCK_MEDIA_PLAY) play.set_sensitive(tree.getNbChildren((0,)) != 0) play.connect('activate', lambda widget: self.playPaths(tree, None, True)) popup.append(play) # Refresh the view refresh = gtk.ImageMenuItem(gtk.STOCK_REFRESH) refresh.connect('activate', lambda widget: self.reloadDisc()) popup.append(refresh) popup.show_all() popup.popup(None, None, None, button, time) def onButtonPressed(self, tree, event, path): """ A mouse button has been pressed """ if event.button == 3: self.onShowPopupMenu(tree, event.button, event.time, path) elif path is not None: if event.button == 2: self.playPaths(tree, [path], False) elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: self.playPaths(tree, None, True) def onKeyPressed(self, tree, event): """ A key has been pressed """ keyname = gtk.gdk.keyval_name(event.keyval) if keyname == 'F5': self.reloadDisc() elif keyname == 'plus': tree.expandRows() elif keyname == 'Left': tree.collapseRows() elif keyname == 'Right': tree.expandRows() elif keyname == 'minus': tree.collapseRows() elif keyname == 'space': tree.switchRows() elif keyname == 'Return': self.playPaths(tree, None, True) # --== Configuration ==-- def configure(self, parent): """ Show the configuration window """ if self.cfgWin is None: self.cfgWin = gui.window.Window('AudioCD.glade', 'vbox1', __name__, MOD_L10N, 335, 270) self.cfgWin.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWin.getWidget('btn-help').connect('clicked', self.onBtnHelp) self.cfgWin.getWidget('chk-useCDDB').connect('toggled', self.onUseCDDBToggled) self.cfgWin.getWidget('btn-clearCache').connect('clicked', self.onBtnClearCache) self.cfgWin.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWin.hide()) # Set up the combo box combo = self.cfgWin.getWidget('combo-read-speed') txtRenderer = gtk.CellRendererText() combo.pack_start(txtRenderer, True) combo.add_attribute(txtRenderer, 'text', 0) combo.set_sensitive(True) txtRenderer.set_property('xpad', 6) # Setup the liststore store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT) combo.set_model(store) for speed in sorted(READ_SPEEDS.iterkeys()): store.append(('%ux' % speed, speed)) if not self.cfgWin.isVisible(): self.cfgWin.getWidget('btn-ok').grab_focus() self.cfgWin.getWidget('txt-device').set_text(prefs.get(__name__, 'device', PREFS_DFT_DEVICE)) self.cfgWin.getWidget('chk-useCDDB').set_active(prefs.get(__name__, 'use-cddb', PREFS_DFT_USE_CDDB)) self.cfgWin.getWidget('chk-useCache').set_sensitive(prefs.get(__name__, 'use-cddb', PREFS_DFT_USE_CDDB)) self.cfgWin.getWidget('chk-useCache').set_active(prefs.get(__name__, 'use-cache', PREFS_DFT_USE_CACHE)) self.cfgWin.getWidget('combo-read-speed').set_active(READ_SPEEDS[prefs.get(__name__, 'read-speed', PREFS_DFT_READ_SPEED)]) self.cfgWin.show() def onUseCDDBToggled(self, useCDDB): """ Toggle the "use cache" checkbox according to the state of the "use CDDB" one """ self.cfgWin.getWidget('chk-useCache').set_sensitive(useCDDB.get_active()) def onBtnClearCache(self, btn): """ Clear CDDB cache """ text = _('This will remove all disc information stored on your hard drive.') question = _('Clear CDDB cache?') if gui.questionMsgBox(self.cfgWin, question, text) == gtk.RESPONSE_YES: self.clearCache() def onBtnOk(self, btn): """ Check that entered information is correct before saving everything """ device = self.cfgWin.getWidget('txt-device').get_text() useCDDB = self.cfgWin.getWidget('chk-useCDDB').get_active() useCache = useCDDB and self.cfgWin.getWidget('chk-useCache').get_active() readSpeed = self.cfgWin.getWidget('combo-read-speed').get_model()[self.cfgWin.getWidget('combo-read-speed').get_active()][1] if not os.path.exists(device): error = _('Invalid path') errorMsg = _('The path to the CD-ROM device is not valid. Please choose an existing path.') gui.errorMsgBox(self.cfgWin, error, errorMsg) self.cfgWin.getWidget('txt-device').grab_focus() else: prefs.set(__name__, 'device', device) prefs.set(__name__, 'use-cddb', useCDDB) prefs.set(__name__, 'use-cache', useCache) prefs.set(__name__, 'read-speed', readSpeed) self.cfgWin.hide() # CD-ROM drive read speed modules.postMsg(consts.MSG_CMD_SET_CD_SPEED, {'speed': readSpeed}) def onBtnHelp(self, btn): """ Display a small help message box """ helpDlg = gui.help.HelpDlg(MOD_L10N) helpDlg.addSection(_('Description'), _('This module lets you play audio discs from your CD-ROM device.')) helpDlg.addSection(_('Compact Disc Data Base (CDDB)'), _('Disc information, such as artist and album title, may be automatically downloaded ' 'from an online database if you wish so. This information may also be saved on your ' 'hard drive to avoid downloading it again the next time you play the same disc.')) helpDlg.show(self.cfgWin) ./decibel-audio-player-1.06/src/modules/AudioScrobbler.py0000644000175000017500000003206311456551413023500 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import modules, os.path, tools, traceback from time import time from tools import consts from gettext import gettext as _ from tools.log import logger MOD_INFO = ('AudioScrobbler', 'AudioScrobbler', _('Keep your Last.fm profile up to date'), [], False, False, consts.MODCAT_INTERNET) CLI_ID = 'dbl' CLI_VER = '0.4' MOD_NAME = MOD_INFO[modules.MODINFO_NAME] PROTO_VER = '1.2' AS_SERVER = 'post.audioscrobbler.com' CACHE_FILE = 'audioscrobbler-cache.txt' MAX_SUBMISSION = 4 # Session ( SESSION_ID, NOW_PLAYING_URL, SUBMISSION_URL ) = range(3) # Current track ( TRK_STARTED_TIMESTAMP, # When the track has been started TRK_UNPAUSED_TIMESTAMP, # When the track has been unpaused (if it ever happened) TRK_PLAY_TIME, # The total play time of this track TRK_INFO # Information about the track ) = range(4) class AudioScrobbler(modules.ThreadedModule): """ This module implements the Audioscrobbler protocol v1.2 (http://www.audioscrobbler.net/development/protocol/) """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_PAUSED: self.onPaused, consts.MSG_EVT_STOPPED: self.onStopped, consts.MSG_EVT_UNPAUSED: self.onUnpaused, consts.MSG_EVT_APP_QUIT: self.onModUnloaded, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, } modules.ThreadedModule.__init__(self, handlers) def getAuthInfo(self): """ Retrieve the login/password of the user """ from gui import authentication if self.login is None: auth = authentication.getAuthInfo('last.fm', _('your Last.fm account')) else: auth = authentication.getAuthInfo('last.fm', _('your Last.fm account'), self.login, True) if auth is None: self.login, self.passwd = None, None else: self.login, self.passwd = auth def handshake(self): """ Authenticate the user to the submission servers, return True if OK """ import hashlib, socket, urllib2 socket.setdefaulttimeout(consts.socketTimeout) now = int(time()) self.session[:] = [None, None, None] # Postpone or cancel this handshake? if self.isBanned or (now - self.lastHandshake) < self.handshakeDelay: return False # Asking for login information must be done in the GTK main loop, because a dialog box might be displayed if needed self.gtkExecute(self.getAuthInfo) if self.passwd is None: return False # Compute the authentication token md5Pwd = hashlib.md5() md5Token = hashlib.md5() md5Pwd.update(self.passwd) md5Token.update('%s%u' % (md5Pwd.hexdigest(), now)) # Try to forget authentication info ASAP token = md5Token.hexdigest() self.passwd = None request = 'http://%s/?hs=true&p=%s&c=%s&v=%s&u=%s&t=%d&a=%s' % (AS_SERVER, PROTO_VER, CLI_ID, CLI_VER, self.login, now, token) self.lastHandshake = now try: hardFailure = False reply = urllib2.urlopen(request).read().strip().split('\n') if reply[0] == 'OK': self.session[:] = reply[1:] self.handshakeDelay = 0 self.nbHardFailures = 0 logger.info('[%s] Logged into Audioscrobbler server' % MOD_NAME) elif reply[0] == 'BANNED': logger.error('[%s] This version of %s has been banned from the server' % (MOD_NAME, consts.appName)) self.isBanned = True elif reply[0] == 'BADAUTH': logger.error('[%s] Bad authentication information' % MOD_NAME) return self.handshake() elif reply[0] == 'BADTIME': logger.error('[%s] Server reported that the current system time is not correct, please correct it' % MOD_NAME) self.isBanned = True else: hardFailure = True logger.error('[%s] Hard failure during handshake' % MOD_NAME) except: hardFailure = True logger.error('[%s] Unable to perform handshake\n\n%s' % (MOD_NAME, traceback.format_exc())) if hardFailure: if self.handshakeDelay == 0: self.handshakeDelay = 1*60 # Start at 1mn elif self.handshakeDelay >= 64*60: self.handshakeDelay = 120*60 # Max 120mn else: self.handshakeDelay *= 2 # Double the delay self.login = None return self.session[SESSION_ID] is not None def nowPlayingNotification(self, track, firstTry = True): """ The Now-Playing notification is a lightweight mechanism for notifying the Audioscrobbler server that a track has started playing """ import urllib2 if (self.session[SESSION_ID] is None and not self.handshake()) or not track.hasArtist() or not track.hasTitle(): return params = ( ( 's', self.session[SESSION_ID] ), ( 'a', tools.percentEncode(track.getSafeArtist()) ), ( 't', tools.percentEncode(track.getSafeTitle()) ), ( 'b', tools.percentEncode(track.getSafeAlbum()) ), ( 'l', track.getSafeLength() ), ( 'n', track.getSafeNumber() ), ( 'm', track.getSafeMBTrackId() ) ) try: data = '&'.join(['%s=%s' % (key, val) for (key, val) in params]) reply = urllib2.urlopen(self.session[NOW_PLAYING_URL], data).read().strip().split('\n') if reply[0] == 'BADSESSION' and firstTry: self.session[:] = [None, None, None] self.nowPlayingNotification(track, False) except: logger.error('[%s] Unable to perform now-playing notification\n\n%s' % (MOD_NAME, traceback.format_exc())) def submit(self, firstTry=True): """ Submit cached tracks, return True if OK """ import urllib2 if (self.session[SESSION_ID] is None and not self.handshake()) or len(self.cache) == 0: return False try: hardFailure = False cachedTracks = self.getFromCache(MAX_SUBMISSION) data = 's=%s&%s' % (self.session[SESSION_ID], '&'.join(cachedTracks)) reply = urllib2.urlopen(self.session[SUBMISSION_URL], data).read().strip().split('\n') if reply[0] == 'OK': self.removeFromCache(len(cachedTracks)) return True elif reply[0] == 'BADSESSION' and firstTry: self.session[:] = [None, None, None] return self.submit(False) else: logger.error('[%s] Unable to perform submission\n\n%s' % (MOD_NAME, reply[0])) hardFailure = True except: hardFailure = True logger.error('[%s] Unable to perform submission\n\n%s' % (MOD_NAME, traceback.format_exc())) if hardFailure: if self.nbHardFailures < 2: self.nbHardFailures += 1 else: self.handshake() else: self.nbHardFailures = 0 return False def onTrackEnded(self, trySubmission): """ The playback of the current track has stopped """ if self.currTrack is not None: self.currTrack[TRK_PLAY_TIME] += (int(time()) - self.currTrack[TRK_UNPAUSED_TIMESTAMP]) self.addToCache() self.currTrack = None # Try to submit the whole cache? if trySubmission: submitOk = self.submit() while submitOk and len(self.cache) != 0: submitOk = self.submit() # --== Cache management ==-- def saveCache(self): """ Save the cache to the disk """ file = os.path.join(consts.dirCfg, CACHE_FILE) output = open(file, 'w') output.writelines('\n'.join(self.cache)) output.close() def addToCache(self): """ Add the current track to the cache, if any, and that all conditions are OK """ if self.currTrack is None: return else: track = self.currTrack[TRK_INFO] if not (track.hasArtist() and track.hasTitle() and track.hasLength()): return if not (track.getLength() >= 30 and (self.currTrack[TRK_PLAY_TIME] >= 240 or self.currTrack[TRK_PLAY_TIME] >= track.getLength()/2)): return params = ( ( 'a[*]', tools.percentEncode(track.getSafeArtist()) ), ( 't[*]', tools.percentEncode(track.getSafeTitle()) ), ( 'i[*]', str(self.currTrack[TRK_STARTED_TIMESTAMP]) ), ( 'o[*]', 'P' ), ( 'r[*]', '' ), ( 'l[*]', track.getSafeLength() ), ( 'b[*]', tools.percentEncode(track.getSafeAlbum()) ), ( 'n[*]', track.getSafeNumber() ), ( 'm[*]', track.getSafeMBTrackId() ) ) self.cache.append('&'.join(['%s=%s' % (key, val) for (key, val) in params])) def getFromCache(self, howMany): """ Return the oldest howMany tracks from the cache, replace the star with the correct index """ if howMany > len(self.cache): howMany = len(self.cache) # Remove '\0' bytes in the data, if any # AudioScrobbler servers reject data when it contains such a byte return [self.cache[i].replace('%0', '').replace('[*]', '[%d]' % i) for i in xrange(howMany)] def removeFromCache(self, howMany): """ Remove the oldest howMany tracks from the cache """ self.cache[:] = self.cache[howMany:] def getCacheSize(self): """ Return the number cached tracks """ return len(self.cache) # --== Message handlers ==-- def onModLoaded(self): """ Initialize this module """ # Attributes self.login = None self.passwd = None self.paused = False self.session = [None, None, None] self.isBanned = False self.currTrack = None self.lastHandshake = 0 self.nbHardFailures = 0 self.handshakeDelay = 0 # Load cache from the disk try: input = open(os.path.join(consts.dirCfg, CACHE_FILE)) self.cache = [strippedTrack for strippedTrack in [track.strip() for track in input.readlines()] if len(strippedTrack) != 0] input.close() except: self.cache = [] def onNewTrack(self, track): """ A new track has started """ timestamp = int(time()) self.onTrackEnded(True) self.nowPlayingNotification(track) self.currTrack = [timestamp, timestamp, 0, track] def onStopped(self): """ Playback has been stopped """ if self.paused: self.currTrack[TRK_UNPAUSED_TIMESTAMP] = int(time()) self.paused = False self.onTrackEnded(True) def onPaused(self): """ Playback has been paused """ self.currTrack[TRK_PLAY_TIME] += (int(time()) - self.currTrack[TRK_UNPAUSED_TIMESTAMP]) self.paused = True def onUnpaused(self): """ Playback has been unpaused """ self.currTrack[TRK_UNPAUSED_TIMESTAMP] = int(time()) self.paused = False def onModUnloaded(self): """ The module has been unloaded """ if self.paused: self.currTrack[TRK_UNPAUSED_TIMESTAMP] = int(time()) self.paused = False self.onTrackEnded(False) self.saveCache() if self.getCacheSize() != 0: logger.info('[%s] %u track(s) left in cache' % (MOD_NAME, self.getCacheSize())) ./decibel-audio-player-1.06/src/modules/DesktopNotification.py0000644000175000017500000002162111456551413024557 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, modules, os.path from tools import consts, prefs from gettext import gettext as _ from tools.log import logger MOD_INFO = ('Desktop Notification', _('Desktop Notification'), _('Display a desktop notification on track change'), ['pynotify'], False, True, consts.MODCAT_DESKTOP) # Default preferences PREFS_DEFAULT_BODY = 'by {artist} on {album} ({playlist_pos} / {playlist_len})' PREFS_DEFAULT_TITLE = '{title} [{duration_str}]' PREFS_DEFAULT_TIMEOUT = 10 PREFS_DEFAULT_SKIP_TRACK = False class DesktopNotification(modules.Module): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_STOPPED: self.hideNotification, consts.MSG_EVT_APP_QUIT: self.hideNotification, consts.MSG_EVT_NEW_TRACK: self.onNewTrack, consts.MSG_CMD_SET_COVER: self.onSetCover, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_TRACK_MOVED: self.onCurrentTrackMoved, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.hideNotification, } modules.Module.__init__(self, handlers) def hideNotification(self): """ Hide the notification """ self.currTrack = None self.currCover = None if self.timeout is not None: gobject.source_remove(self.timeout) self.timeout = None if self.notif is not None: self.notif.close() def __createNotification(self, title, body, icon): """ Create the Notification object """ import pynotify if not pynotify.init(consts.appNameShort): logger.error('[%s] Initialization of pynotify failed' % MOD_INFO[modules.MODINFO_NAME]) self.notif = pynotify.Notification(title, body, icon) self.notif.set_urgency(pynotify.URGENCY_LOW) self.notif.set_timeout(prefs.get(__name__, 'timeout', PREFS_DEFAULT_TIMEOUT) * 1000) if prefs.get(__name__, 'skip-track', PREFS_DEFAULT_SKIP_TRACK): self.notif.add_action('stop', _('Skip track'), self.onSkipTrack) def showNotification(self): """ Show the notification based on the current track """ self.timeout = None # Can this happen? if self.currTrack is None: return False # Contents body = self.currTrack.formatHTMLSafe(prefs.get(__name__, 'body', PREFS_DEFAULT_BODY)) title = self.currTrack.format(prefs.get(__name__, 'title', PREFS_DEFAULT_TITLE)) # Icon if self.currCover is None: img = os.path.join(consts.dirPix, 'decibel-audio-player-64.png') else: img = self.currCover if os.path.isfile(img): icon = 'file://' + img else: icon = gtk.STOCK_DIALOG_INFO # Create / Update the notification and show it if self.notif is None: self.__createNotification(title, body, icon) else: self.notif.update(title, body, icon) self.notif.show() return False def onSkipTrack(self, notification, action): """ The user wants to skip the current track """ if self.hasNext: modules.postMsg(consts.MSG_CMD_NEXT) else: modules.postMsg(consts.MSG_CMD_STOP) # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ self.notif = None self.cfgWin = None self.hasNext = False self.timeout = None self.currTrack = None self.currCover = None def onNewTrack(self, track): """ A new track is being played """ self.currCover = None self.currTrack = track if self.timeout is not None: gobject.source_remove(self.timeout) # Wait a bit for the cover to be set (if any) self.timeout = gobject.timeout_add(500, self.showNotification) def onSetCover(self, track, pathThumbnail, pathFullSize): """ The cover for the given track """ # We must check first whether currTrack is not None, because '==' calls the cmp() method and this fails on None if self.currTrack is not None and track == self.currTrack: self.currCover = pathThumbnail def onCurrentTrackMoved(self, hasNext, hasPrevious): """ The position of the current track has changed """ self.hasNext = hasNext # --== Configuration ==-- def configure(self, parent): """ Show the configuration window """ if self.cfgWin is None: import gui, pynotify # Create the window self.cfgWin = gui.window.Window('DesktopNotification.glade', 'vbox1', __name__, MOD_INFO[modules.MODINFO_L10N], 355, 345) self.cfgWin.getWidget('btn-ok').connect('clicked', self.onBtnOk) self.cfgWin.getWidget('btn-help').connect('clicked', self.onBtnHelp) self.cfgWin.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWin.hide()) # Disable the 'Skip track' button if the server doesn't support buttons in notifications if 'actions' not in pynotify.get_server_caps(): self.cfgWin.getWidget('chk-skipTrack').set_sensitive(False) if not self.cfgWin.isVisible(): self.cfgWin.getWidget('txt-title').set_text(prefs.get(__name__, 'title', PREFS_DEFAULT_TITLE)) self.cfgWin.getWidget('spn-duration').set_value(prefs.get(__name__, 'timeout', PREFS_DEFAULT_TIMEOUT)) self.cfgWin.getWidget('txt-body').get_buffer().set_text(prefs.get(__name__, 'body', PREFS_DEFAULT_BODY)) self.cfgWin.getWidget('chk-skipTrack').set_active(prefs.get(__name__, 'skip-track', PREFS_DEFAULT_SKIP_TRACK)) self.cfgWin.getWidget('btn-ok').grab_focus() self.cfgWin.show() def onBtnOk(self, btn): """ Save new preferences """ # Skipping tracks newSkipTrack = self.cfgWin.getWidget('chk-skipTrack').get_active() oldSkipTrack = prefs.get(__name__, 'skip-track', PREFS_DEFAULT_SKIP_TRACK) prefs.set(__name__, 'skip-track', newSkipTrack) if oldSkipTrack != newSkipTrack and self.notif is not None: if newSkipTrack: self.notif.add_action('stop', _('Skip track'), self.onSkipTrack) else: self.notif.clear_actions() # Timeout newTimeout = int(self.cfgWin.getWidget('spn-duration').get_value()) oldTimeout = prefs.get(__name__, 'timeout', PREFS_DEFAULT_TIMEOUT) prefs.set(__name__, 'timeout', newTimeout) if oldTimeout != newTimeout and self.notif is not None: self.notif.set_timeout(newTimeout * 1000) # Other preferences prefs.set(__name__, 'title', self.cfgWin.getWidget('txt-title').get_text()) (start, end) = self.cfgWin.getWidget('txt-body').get_buffer().get_bounds() prefs.set(__name__, 'body', self.cfgWin.getWidget('txt-body').get_buffer().get_text(start, end)) self.cfgWin.hide() def onBtnHelp(self, btn): """ Display a small help message box """ import gui, media helpDlg = gui.help.HelpDlg(MOD_INFO[modules.MODINFO_L10N]) helpDlg.addSection(_('Description'), _('This module displays a small popup window on your desktop when a new track starts.')) helpDlg.addSection(_('Customizing the Notification'), _('You can change the title and the body of the notification to any text you want. Before displaying ' 'the popup window, fields of the form {field} are replaced by their corresponding value. ' 'Available fields are:\n\n') + media.track.getFormatSpecialFields(False)) helpDlg.addSection(_('Markup'), _('You can use the Pango markup language to format the text. More information on that language is ' 'available on the following web page:') + '\n\nhttp://www.pygtk.org/pygtk2reference/pango-markup-language.html') helpDlg.show(self.cfgWin) ./decibel-audio-player-1.06/src/modules/Equalizer.py0000644000175000017500000002506311456551413022544 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gobject, gtk, gui, modules from gui import fileChooser from tools import consts, prefs from gettext import gettext as _ MOD_INFO = ('Equalizer', _('Equalizer'), _('Tune the level of the frequency bands'), [], False, True, consts.MODCAT_DECIBEL) # Entries of the presets combo box ( ROW_PRESET_IS_SEPARATOR, ROW_PRESET_NAME, ROW_PRESET_VALUES, ) = range(3) class Equalizer(modules.Module): """ This module lets the user tune the level of 10 frequency bands """ def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onAppStarted, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, } modules.Module.__init__(self, handlers) def modInit(self): """ Initialize the module """ self.lvls = prefs.get(__name__, 'levels', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) self.preset = prefs.get(__name__, 'preset', _('Flat')) self.cfgWindow = None modules.addMenuItem(_('Equalizer'), self.configure, 'E') # --== Message handlers ==-- def onModLoaded(self): """ The module has been loaded """ self.modInit() self.restartRequired() def onModUnloaded(self): """ The module has been unloaded """ modules.delMenuItem(_('Equalizer')) self.restartRequired() def onAppStarted(self): """ The application has started """ self.modInit() modules.postMsg(consts.MSG_CMD_ENABLE_EQZ) modules.postMsg(consts.MSG_CMD_SET_EQZ_LVLS, {'lvls': self.lvls}) # --== Configuration ==-- def configure(self, parent): """ Show the configuration dialog """ if self.cfgWindow is None: import gui.window self.cfgWindow = gui.window.Window('Equalizer.glade', 'vbox1', __name__, MOD_INFO[modules.MODINFO_L10N], 580, 300) self.timer = None self.combo = self.cfgWindow.getWidget('combo-presets') self.scales = [] self.comboStore = gtk.ListStore(gobject.TYPE_BOOLEAN, gobject.TYPE_STRING, gobject.TYPE_PYOBJECT) self.targetLvls = [] # Setup the scales for i in xrange(10): self.scales.append(self.cfgWindow.getWidget('vscale' + str(i))) self.scales[i].set_value(self.lvls[i]) self.scales[i].connect('value-changed', self.onScaleValueChanged, i) # Setup the combo box txtRenderer = gtk.CellRendererText() self.combo.pack_start(txtRenderer, True) self.combo.add_attribute(txtRenderer, 'text', ROW_PRESET_NAME) self.combo.set_model(self.comboStore) self.combo.set_row_separator_func(lambda model, iter: model.get_value(iter, ROW_PRESET_IS_SEPARATOR)) # Add presets to the combo box self.comboStore.append((False, 'Classic V', ( 7, 5, 0, -5, -8, -7, -4, -1, 3, 5))) self.comboStore.append((False, 'Classical', ( 0, 0, 0, 0, 0, 0, 0, -2, -5, -6))) self.comboStore.append((False, 'Dance' , ( 6, 5, 4, 3, 1, 0, -3, -5, -5, 0))) self.comboStore.append((False, 'Flat' , ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))) self.comboStore.append((False, 'Live' , (-4, -2, 0, 2, 3, 3, 3, 3, 2, 0))) self.comboStore.append((False, 'Metal' , ( 3, 4, 5, 1, -2, 0, 1, 1, -1, -1))) self.comboStore.append((False, 'Pop' , ( 3, 6, 3, -2, -4, -3, 0, 2, 3, 5))) self.comboStore.append((False, 'Reggae' , ( 1, 1, 1, 0, -3, 0, 3, 4, 2, 1))) self.comboStore.append((False, 'Rock' , ( 5, 4, 2, -2, -3, -3, 2, 4, 5, 5))) self.comboStore.append((False, 'Techno' , ( 4, 4, 3, 2, 0, -4, -2, 0, 3, 4))) # Select the right entry if self.preset is None: self.comboStore.insert(0, (False, _('Custom'), None)) self.comboStore.insert(1, (True, '', None)) self.combo.set_active(0) else: for i, preset in enumerate(self.comboStore): if preset[ROW_PRESET_NAME] == self.preset: self.combo.set_active(i) break # Events self.cfgWindow.getWidget('btn-save').connect('clicked', self.onBtnSave) self.cfgWindow.getWidget('btn-open').connect('clicked', self.onBtnOpen) self.cfgWindow.getWidget('btn-close').connect('clicked', lambda btn: self.cfgWindow.hide()) self.combo.connect('changed', self.onPresetChanged) if not self.cfgWindow.isVisible(): self.cfgWindow.getWidget('btn-close').grab_focus() self.cfgWindow.show() def onPresetChanged(self, combo): """ A preset has been selected """ idx = combo.get_active() if idx != -1: iter = self.comboStore.get_iter(idx) preset = self.comboStore.get_value(iter, ROW_PRESET_NAME) self.jumpToTargetLvls(self.comboStore.get_value(iter, ROW_PRESET_VALUES)) # Remove the 'Custom' entry if needed if self.preset is None: self.comboStore.remove(self.comboStore.get_iter((0, ))) self.comboStore.remove(self.comboStore.get_iter((0, ))) self.preset = preset prefs.set(__name__, 'preset', self.preset) def onBtnSave(self, btn): """ Save the current levels to a file""" outFile = fileChooser.save(self.cfgWindow, _('Save levels'), 'levels.dat') if outFile is not None: output = open(outFile, 'wt') for i in xrange(10): output.write(str(self.lvls[i]) + '\n') output.close() def onBtnOpen(self, btn): """ Load the levels from a file""" inFile = fileChooser.openFile(self.cfgWindow, _('Load levels')) if inFile is not None: input = open(inFile, 'rt') lines = input.readlines() input.close() lvls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] isInvalid = True if len(lines) == 10: isInvalid = False for i in xrange(10): elts = lines[i].split() try: if len(elts) == 1: lvls[i] = float(elts[0]) if lvls[i] >= -24 and lvls[i] <= 12: continue except: pass isInvalid = True break if isInvalid: gui.errorMsgBox(self.cfgWindow, _('Could not load the file'), _('The format of the file is incorrect.')) else: self.jumpToTargetLvls(lvls) # Add a 'custom' entry to the presets if needed if self.preset is not None: self.preset = None prefs.set(__name__, 'preset', self.preset) self.combo.handler_block_by_func(self.onPresetChanged) self.comboStore.insert(0, (False, _('Custom'), None)) self.comboStore.insert(1, (True, '', None)) self.combo.set_active(0) self.combo.handler_unblock_by_func(self.onPresetChanged) def onScaleValueChanged(self, scale, idx): """ The user has moved one of the scales """ # Add a 'custom' entry to the presets if needed if self.preset is not None: self.preset = None prefs.set(__name__, 'preset', self.preset) self.combo.handler_block_by_func(self.onPresetChanged) self.comboStore.insert(0, (False, _('Custom'), None)) self.comboStore.insert(1, (True, '', None)) self.combo.set_active(0) self.combo.handler_unblock_by_func(self.onPresetChanged) self.lvls[idx] = scale.get_value() prefs.set(__name__, 'levels', self.lvls) modules.postMsg(consts.MSG_CMD_SET_EQZ_LVLS, {'lvls': self.lvls}) def jumpToTargetLvls(self, targetLvls): """ Move the scales until they reach some target levels """ if self.timer is not None: gobject.source_remove(self.timer) self.timer = gobject.timeout_add(20, self.timerFunc) self.targetLvls = targetLvls for i in xrange(10): self.scales[i].handler_block_by_func(self.onScaleValueChanged) def timerFunc(self): """ Move a bit the scales to their target value """ isFinished = True # Move the scales a bit for i in xrange(10): currLvl = self.scales[i].get_value() targetLvl = self.targetLvls[i] difference = targetLvl - currLvl if abs(difference) <= 0.25: newLvl = targetLvl else: newLvl = currLvl + (difference / 8.0) isFinished = False self.lvls[i] = newLvl self.scales[i].set_value(newLvl) # Set the equalizer to the new levels modules.postMsg(consts.MSG_CMD_SET_EQZ_LVLS, {'lvls': self.lvls}) if isFinished: self.timer = None prefs.set(__name__, 'levels', self.lvls) # Make sure labels are up to date (sometimes they aren't when we're done with the animation) # Also unblock the handlers for i in xrange(10): self.scales[i].queue_draw() self.scales[i].handler_unblock_by_func(self.onScaleValueChanged) return False return True ./decibel-audio-player-1.06/src/modules/Library.py0000644000175000017500000012142411456551413022205 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, media, modules, os, tools from tools import consts, htmlEscape, icons, prefs, pickleLoad, pickleSave from gettext import ngettext, gettext as _ from os.path import isdir, isfile from gobject import idle_add, TYPE_STRING, TYPE_INT, TYPE_PYOBJECT from tools.log import logger from media.track.fileTrack import FileTrack MOD_INFO = ('Library', _('Library'), _('Organize your music by tags'), [], False, True, consts.MODCAT_EXPLORER) MOD_L10N = MOD_INFO[modules.MODINFO_L10N] # Information associated with libraries ( LIB_PATH, # Physical location of media files LIB_NB_ARTISTS, # Number of artists LIB_NB_ALBUMS, # Number of albums LIB_NB_TRACKS # Number of tracks ) = range(4) # Information associated with artists ( ART_NAME, # Its name ART_INDEX, # Name of the directory: avoid the use of the artist name as a filename (may contain invalid characters) ART_NB_ALBUMS # How many albums ) = range(3) # Information associated with albums ( ALB_NAME, # Its name ALB_INDEX, # Name of the file: avoid the use of the artist name as a filename (may contain invalid characters) ALB_NB_TRACKS, # Number of tracks ALB_LENGTH # Complete duration (include all tracks) ) = range(4) # Possible types for a node of the tree ( TYPE_ARTIST, # Artist TYPE_ALBUM, # Album TYPE_TRACK, # Single track TYPE_HEADER, # Alphabetical header TYPE_FAVORITES_BANNER, # Favorites banner (when showing only favorites) TYPE_NONE # Used for fake children ) = range(6) # The format of a row in the treeview ( ROW_PIXBUF, # Item icon ROW_ALBUM_LEN, # Length of the album (invisible when not an album) ROW_NAME, # Item name ROW_TYPE, # The type of the item (e.g., directory, file) ROW_FULLPATH, # The full path to the item ROW_DATA # Arbitrary data that depend on the type of the row ) = range(6) # Constants VERSION = 3 # Used to check compatibility ROOT_PATH = os.path.join(consts.dirCfg, 'Library') # Path where libraries are stored FAKE_CHILD = (None, None, '', TYPE_NONE, '', None) # We use a lazy tree PREFS_DEFAULT_PREFIXES = {'the ': None} # Prefixes are put at the end of artists' names PREFS_DEFAULT_LIBRARIES = {} # No libraries at first PREFS_DEFAULT_TREE_STATE = {} # No state at first PREFS_DEFAULT_SHOW_ONLY_FAVORITES = False class Library(modules.Module): def __init__(self): """ Constructor """ handlers = { consts.MSG_EVT_APP_QUIT: self.onModUnloaded, consts.MSG_EVT_MOD_LOADED: self.onModLoaded, consts.MSG_EVT_APP_STARTED: self.onModLoaded, consts.MSG_EVT_MOD_UNLOADED: self.onModUnloaded, consts.MSG_EVT_EXPLORER_CHANGED: self.onExplorerChanged, } modules.Module.__init__(self, handlers) def __createTree(self): """ Create the main tree, add it to the scrolled window """ from gui.extTreeview import ExtTreeView txtRdr = gtk.CellRendererText() pixbufRdr = gtk.CellRendererPixbuf() txtRdrAlbumLen = gtk.CellRendererText() columns = (('', [(pixbufRdr, gtk.gdk.Pixbuf), (txtRdrAlbumLen, TYPE_STRING), (txtRdr, TYPE_STRING)], False), (None, [(None, TYPE_INT)], False), (None, [(None, TYPE_STRING)], False), (None, [(None, TYPE_PYOBJECT)], False)) self.tree = ExtTreeView(columns, True) # The first text column (ROW_ALBUM_LEN) is not the one to search for # set_search_column(ROW_NAME) should work, but it doesn't... self.tree.set_search_equal_func(self.__searchFunc) self.tree.get_column(0).set_cell_data_func(txtRdr, self.__drawCell) self.tree.get_column(0).set_cell_data_func(pixbufRdr, self.__drawCell) self.tree.get_column(0).set_cell_data_func(txtRdrAlbumLen, self.__drawAlbumLenCell) # The album length is written in a smaller font, with a lighter color txtRdrAlbumLen.set_property('scale', 0.85) txtRdrAlbumLen.set_property('foreground-gdk', self.tree.get_style().text[gtk.STATE_INSENSITIVE]) self.tree.setDNDSources([consts.DND_TARGETS[consts.DND_DAP_TRACKS]]) # GTK handlers self.tree.connect('drag-data-get', self.onDragDataGet) self.tree.connect('key-press-event', self.onKeyPressed) self.tree.connect('exttreeview-row-expanded', self.onRowExpanded) self.tree.connect('exttreeview-row-collapsed', self.onRowCollapsed) self.tree.connect('exttreeview-button-pressed', self.onButtonPressed) # Add the tree to the scrolled window self.scrolled.add(self.tree) def __searchFunc(self, model, column, key, iter): """ Check whether the given key matches the current candidate (iter) """ return model.get_value(iter, ROW_NAME)[:len(key)].lower() != key.lower() def __drawCell(self, column, cell, model, iter): """ Use a different background color for alphabetical headers """ if model.get_value(iter, ROW_TYPE) == TYPE_HEADER: cell.set_property('cell-background-gdk', self.tree.style.bg[gtk.STATE_PRELIGHT]) else: cell.set_property('cell-background', None) def __drawAlbumLenCell(self, column, cell, model, iter): """ Use a different background color for alphabetical headers """ if model.get_value(iter, ROW_ALBUM_LEN) is None: cell.set_property('visible', False) else: cell.set_property('visible', True) def __createEmptyLibrary(self, name): """ Create bootstrap files for a new library """ import shutil # Make sure that the root directory of all libraries exists if not isdir(ROOT_PATH): os.mkdir(ROOT_PATH) # Start from an empty library libPath = os.path.join(ROOT_PATH, name) if isdir(libPath): shutil.rmtree(libPath) os.mkdir(libPath) pickleSave(os.path.join(libPath, 'files'), {}) def refreshLibrary(self, parent, libName, path, creation=False): """ Refresh the given library, must be called through idle_add() """ import collections, shutil from gui import progressDlg # First show a progress dialog if creation: header = _('Creating library') else: header = _('Refreshing library') progress = progressDlg.ProgressDlg(parent, header, _('The directory is scanned for media files. This can take some time.\nPlease wait.')) yield True libPath = os.path.join(ROOT_PATH, libName) # Location of the library # If the version number has changed or does not exist, don't reuse any existing file and start from scratch if not os.path.exists(os.path.join(libPath, 'VERSION_%u' % VERSION)): self.__createEmptyLibrary(libName) db = {} # The dictionnary used to create the library queue = collections.deque((path,)) # Faster structure for appending/removing elements mediaFiles = [] # All media files found newLibrary = {} # Reflect the current file structure of the library oldLibrary = pickleLoad(os.path.join(libPath, 'files')) # Previous file structure of the same library # Make sure the root directory still exists if not os.path.exists(path): queue.pop() while len(queue) != 0: currDir = queue.pop() currDirMTime = os.stat(currDir).st_mtime # Retrieve previous information on the current directory, if any if currDir in oldLibrary: oldDirMTime, oldDirectories, oldFiles = oldLibrary[currDir] else: oldDirMTime, oldDirectories, oldFiles = -1, [], {} # If the directory has not been modified, keep old information if currDirMTime == oldDirMTime: files, directories = oldFiles, oldDirectories else: files, directories = {}, [] for (filename, fullPath) in tools.listDir(currDir): if isdir(fullPath): directories.append(fullPath) elif isfile(fullPath) and media.isSupported(filename): if filename in oldFiles: files[filename] = oldFiles[filename] else: files[filename] = [-1, FileTrack(fullPath)] # Determine which files need to be updated for filename, (oldMTime, track) in files.iteritems(): mTime = os.stat(track.getFilePath()).st_mtime if mTime != oldMTime: files[filename] = [mTime, media.getTrackFromFile(track.getFilePath())] newLibrary[currDir] = (currDirMTime, directories, files) mediaFiles.extend([track for mTime, track in files.itervalues()]) queue.extend(directories) # Update the progress dialog try: text = ngettext('Scanning directories (one track found)', 'Scanning directories (%(nbtracks)u tracks found)', len(mediaFiles)) progress.pulse(text % {'nbtracks': len(mediaFiles)}) yield True except progressDlg.CancelledException: progress.destroy() if creation: shutil.rmtree(libPath) yield False # From now on, the process should not be cancelled progress.setCancellable(False) if creation: progress.pulse(_('Creating library...')) else: progress.pulse(_('Refreshing library...')) yield True # Create the database for track in mediaFiles: album = track.getExtendedAlbum() if track.hasAlbumArtist(): artist = track.getAlbumArtist() else: artist = track.getArtist() if artist in db: allAlbums = db[artist] if album in allAlbums: allAlbums[album].append(track) else: allAlbums[album] = [track] else: db[artist] = {album: [track]} progress.pulse() yield True # If an artist name begins with a known prefix, put it at the end (e.g., Future Sound of London (The)) prefixes = prefs.get(__name__, 'prefixes', PREFS_DEFAULT_PREFIXES) for artist in db.keys(): artistLower = artist.lower() for prefix in prefixes: if artistLower.startswith(prefix): db[artist[len(prefix):] + ' (%s)' % artist[:len(prefix)-1]] = db[artist] del db[artist] progress.pulse() yield True # Load favorites before removing the files from the disk if self.currLib == libName: favorites = self.favorites else: favorites = self.loadFavorites(libName) # Re-create the library structure on the disk if isdir(libPath): shutil.rmtree(libPath) os.mkdir(libPath) # Put a version number tools.touch(os.path.join(libPath, 'VERSION_%u' % VERSION)) overallNbAlbums = 0 overallNbTracks = 0 overallNbArtists = len(db) # The 'artists' file contains all known artists with their index, the 'files' file contains the file structure of the root path allArtists = sorted([(artist, str(indexArtist), len(db[artist])) for indexArtist, artist in enumerate(db)], key = lambda a: a[0].lower()) pickleSave(os.path.join(libPath, 'files'), newLibrary) pickleSave(os.path.join(libPath, 'artists'), allArtists) for (artist, indexArtist, nbAlbums) in allArtists: artistPath = os.path.join(libPath, indexArtist) overallNbAlbums += nbAlbums os.mkdir(artistPath) albums = [] for index, (name, tracks) in enumerate(db[artist].iteritems()): length = sum([track.getLength() for track in tracks]) overallNbTracks += len(tracks) albums.append((name, str(index), len(tracks), length)) pickleSave(os.path.join(artistPath, str(index)), sorted(tracks, key = lambda track: track.getNumber())) albums.sort(cmp = lambda a1, a2: cmp(db[artist][a1[0]][0], db[artist][a2[0]][0])) pickleSave(os.path.join(artistPath, 'albums'), albums) progress.pulse() yield True self.libraries[libName] = (path, overallNbArtists, overallNbAlbums, overallNbTracks) self.fillLibraryList() if creation: modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': libName, 'icon': icons.dirMenuIcon(), 'widget': self.scrolled}) progress.destroy() # Trim favorites and save them newFavorites = {} for (artist, albums) in favorites.iteritems(): if artist in db: newFavorites[artist] = {} for album in albums: if album in db[artist]: newFavorites[artist][album] = None self.saveFavorites(libName, newFavorites) # If the refreshed library is currently displayed, refresh the treeview as well if self.currLib == libName: self.saveTreeState() self.favorites = newFavorites self.loadArtists(self.tree, self.currLib) self.restoreTreeState() yield False def __getTracksFromPaths(self, tree, paths): """ Return the list of tracks extracted from: * The list 'paths' if it is not None * The currently selected rows if 'paths' is None """ from sys import maxint tracks = [] if paths is None: paths = tree.getSelectedPaths() for currPath in paths: row = tree.getRow(currPath) if row[ROW_TYPE] == TYPE_TRACK: tracks.append(row[ROW_DATA]) elif row[ROW_TYPE] == TYPE_ALBUM: tracks.extend(pickleLoad(row[ROW_FULLPATH])) elif row[ROW_TYPE] == TYPE_ARTIST: for album in pickleLoad(os.path.join(row[ROW_FULLPATH], 'albums')): tracks.extend(pickleLoad(os.path.join(row[ROW_FULLPATH], album[ALB_INDEX]))) elif row[ROW_TYPE] == TYPE_HEADER: for path in xrange(currPath[0]+1, maxint): if not tree.isValidPath(path): break row = tree.getRow(path) if row[ROW_TYPE] == TYPE_HEADER: break for album in pickleLoad(os.path.join(row[ROW_FULLPATH], 'albums')): tracks.extend(pickleLoad(os.path.join(row[ROW_FULLPATH], album[ALB_INDEX]))) return tracks def playPaths(self, tree, paths, replace): """ Replace/extend the tracklist If the list 'paths' is None, use the current selection """ tracks = self.__getTracksFromPaths(tree, paths) if replace: modules.postMsg(consts.MSG_CMD_TRACKLIST_SET, {'tracks': tracks, 'playNow': True}) else: modules.postMsg(consts.MSG_CMD_TRACKLIST_ADD, {'tracks': tracks, 'playNow': False}) def pickAlbumArtist(self, tree, artistPath): """ Pick an album at random of the given artist and play it """ import random # Expanding the artist row populates it, so that we can then pick an album at random tree.expandRow(artistPath) albumPath = artistPath + (random.randint(0, tree.getNbChildren(artistPath)-1), ) # Select the random album and play it tree.get_selection().unselect_all() tree.get_selection().select_path(albumPath) tree.scroll(albumPath) self.playPaths(tree, [albumPath], True) def pickAlbumLibrary(self, tree): """ Pick an album at random in the library and play it """ import random # Pick an artist at random (make sure not to select an alphabetical header) path = (random.randint(0, tree.getCount()-1), ) while tree.getItem(path, ROW_TYPE) != TYPE_ARTIST: path = (random.randint(0, tree.getCount()-1), ) self.pickAlbumArtist(tree, path) def switchFavoriteStateOfSelectedItems(self, tree): """ Add to/remove from favorites the selected items """ # Go through selected items and switch their state removed = False for path in tree.getSelectedPaths(): if tree.getItem(path, ROW_TYPE) == TYPE_ALBUM: album = tree.getItem(path, ROW_DATA) artist = tree.getItem(path[:-1], ROW_DATA) if self.isAlbumInFavorites(artist, album): removed = True tree.setItem(path, ROW_PIXBUF, icons.mediaDirMenuIcon()) self.removeFromFavorites(artist, album) else: tree.setItem(path, ROW_PIXBUF, icons.starDirMenuIcon()) self.addToFavorites(artist, album) # If some favorites were removed, we may have to reload the tree if self.showOnlyFavorites and removed: self.saveTreeState() self.loadArtists(self.tree, self.currLib) self.restoreTreeState() def switchFavoritesView(self, tree): """ Show all/favorites """ self.saveTreeState() self.showOnlyFavorites = not self.showOnlyFavorites prefs.set(__name__, 'show-only-favorites', self.showOnlyFavorites) self.loadArtists(self.tree, self.currLib) self.restoreTreeState() def showPopupMenu(self, tree, button, time, path): """ Show a popup menu """ popup = gtk.Menu() # Play play = gtk.ImageMenuItem(gtk.STOCK_MEDIA_PLAY) popup.append(play) if path is None: play.set_sensitive(False) else: play.connect('activate', lambda widget: self.playPaths(tree, None, True)) # Separator popup.append(gtk.SeparatorMenuItem()) # Add to/remove from favorites favCpt = 0 nonFavCpt = 0 for node in tree.getSelectedPaths(): if tree.getItem(node, ROW_TYPE) != TYPE_ALBUM: favCpt = 1 nonFavCpt = 1 break elif tree.getItem(node, ROW_PIXBUF) == icons.mediaDirMenuIcon(): nonFavCpt += 1 else: favCpt += 1 if favCpt == 0: favorite = gtk.ImageMenuItem(_('Add to Favorites')) elif nonFavCpt == 0: favorite = gtk.ImageMenuItem(_('Remove from Favorites')) else: favorite = gtk.ImageMenuItem(_('Favorites')) favorite.get_image().set_from_pixbuf(icons.starMenuIcon()) popup.append(favorite) if TYPE_ALBUM in [tree.getItem(path, ROW_TYPE) for path in tree.getSelectedPaths()]: favorite.connect('activate', lambda widget: self.switchFavoriteStateOfSelectedItems(tree)) else: favorite.set_sensitive(False) # Show only favorites showFavorites = gtk.CheckMenuItem(_('Show Only Favorites')) showFavorites.set_active(self.showOnlyFavorites) showFavorites.connect('toggled', lambda widget: self.switchFavoritesView(tree)) popup.append(showFavorites) # Separator popup.append(gtk.SeparatorMenuItem()) # Collapse all nodes collapse = gtk.ImageMenuItem(_('Collapse all')) collapse.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU)) popup.append(collapse) enabled = False for child in self.tree.iterChildren(None): if self.tree.row_expanded(child): enabled = True break if enabled: collapse.connect('activate', lambda widget: self.tree.collapse_all()) else: collapse.set_sensitive(False) # Refresh the library refresh = gtk.ImageMenuItem(gtk.STOCK_REFRESH) refresh.connect('activate', lambda widget: idle_add(self.refreshLibrary(None, self.currLib, self.libraries[self.currLib][LIB_PATH]).next)) popup.append(refresh) # Randomness randomness = gtk.Menu() randomnessItem = gtk.ImageMenuItem(_('Randomness')) randomnessItem.get_image().set_from_icon_name('stock_shuffle', gtk.ICON_SIZE_MENU) randomnessItem.set_submenu(randomness) popup.append(randomnessItem) # Random album of the selected artist if path is not None and tree.getItem(path, ROW_TYPE) == TYPE_ARTIST: album = gtk.MenuItem(_('Pick an album of %(artist)s' % {'artist': tree.getItem(path, ROW_NAME).replace('&', '&')})) album.connect('activate', lambda widget: self.pickAlbumArtist(tree, path)) randomness.append(album) # Random album in the entire library album = gtk.MenuItem(_('Pick an album in the library')) album.connect('activate', lambda widget: self.pickAlbumLibrary(tree)) randomness.append(album) popup.show_all() popup.popup(None, None, None, button, time) # --== Populating the tree ==-- def loadArtists(self, tree, name): """ Load the given library """ libPath = os.path.join(ROOT_PATH, name) # Make sure the version number is the good one if not os.path.exists(os.path.join(libPath, 'VERSION_%u' % VERSION)): logger.error('[%s] Version number does not match, loading of library "%s" aborted' % (MOD_INFO[modules.MODINFO_NAME], name)) error = _('This library is deprecated, please refresh it.') tree.replaceContent([(icons.errorMenuIcon(), None, error, TYPE_NONE, None, None)]) return rows = [] icon = icons.dirMenuIcon() prevChar = '' allArtists = pickleLoad(os.path.join(libPath, 'artists')) # Filter artists if needed if self.showOnlyFavorites: allArtists = [artist for artist in allArtists if self.isArtistInFavorites(artist[ART_NAME])] rows.append((icons.starMenuIcon(), None, '%s' % _('My Favorites'), TYPE_FAVORITES_BANNER, None, None)) # Create the rows for artist in allArtists: if len(artist[ART_NAME]) != 0: currChar = unicode(artist[ART_NAME], errors='replace')[0].lower() else: currChar = prevChar if prevChar != currChar and not (prevChar.isdigit() and currChar.isdigit()): prevChar = currChar if currChar.isdigit(): rows.append((None, None, '0 - 9', TYPE_HEADER, None, None)) else: rows.append((None, None, '%s' % currChar.upper(), TYPE_HEADER, None, None)) rows.append((icon, None, htmlEscape(artist[ART_NAME]), TYPE_ARTIST, os.path.join(libPath, artist[ART_INDEX]), artist[ART_NAME])) # Insert all rows, and then add a fake child to each artist tree.replaceContent(rows) for node in tree.iterChildren(None): if tree.getItem(node, ROW_TYPE) == TYPE_ARTIST: tree.appendRow(FAKE_CHILD, node) def loadAlbums(self, tree, node, fakeChild): """ Initial load of the albums of the given node, assuming it is of type TYPE_ARTIST """ rows = [] path = tree.getItem(node, ROW_FULLPATH) artist = tree.getItem(node, ROW_DATA) allAlbums = pickleLoad(os.path.join(tree.getItem(node, ROW_FULLPATH), 'albums')) # Filter albums if only favorites should be shown if self.showOnlyFavorites: allAlbums = [album for album in allAlbums if self.isAlbumInFavorites(artist, album[ALB_NAME])] # The icon depends on whether the album is in the favorites for album in allAlbums: if self.isAlbumInFavorites(artist, album[ALB_NAME]): icon = icons.starDirMenuIcon() else: icon = icons.mediaDirMenuIcon() rows.append((icon, '[%s]' % tools.sec2str(album[ALB_LENGTH], True), '%s' % htmlEscape(album[ALB_NAME]), TYPE_ALBUM, os.path.join(path, album[ALB_INDEX]), album[ALB_NAME])) # Add all the rows, and then add a fake child to each of them tree.appendRows(rows, node) tree.removeRow(fakeChild) for child in tree.iterChildren(node): tree.appendRow(FAKE_CHILD, child) def loadTracks(self, tree, node, fakeChild): """ Initial load of all tracks of the given node, assuming it is of type TYPE_ALBUM """ allTracks = pickleLoad(tree.getItem(node, ROW_FULLPATH)) icon = icons.mediaFileMenuIcon() rows = [(icon, None, '%02u. %s' % (track.getNumber(), htmlEscape(track.getTitle())), TYPE_TRACK, track.getFilePath(), track) for track in allTracks] tree.appendRows(rows, node) tree.removeRow(fakeChild) # --== Manage tree state ==-- def saveTreeState(self): """ Save the current tree state """ if self.showOnlyFavorites: self.treeStates[self.currLib + ' favorites'] = self.tree.saveState(ROW_NAME) else: self.treeStates[self.currLib] = self.tree.saveState(ROW_NAME) def restoreTreeState(self): """ Restore the tree state """ if self.showOnlyFavorites: name = self.currLib + ' favorites' else: name = self.currLib if name in self.treeStates: self.tree.restoreState(self.treeStates[name], ROW_NAME) def removeTreeStates(self, libName): """ Remove the tree states associated to the given library """ if libName in self.treeStates: del self.treeStates[libName] if libName + ' favorites' in self.treeStates: del self.treeStates[libName + ' favorites'] def renameTreeStates(self, oldLibName, newLibName): """ Rename the tree states associated with oldLibName """ if oldLibName in self.treeStates: self.treeStates[newLibName] = self.treeStates[oldLibName] del self.treeStates[oldLibName] if oldLibName + ' favorites' in self.treeStates: self.treeStates[newLibName + ' favorites'] = self.treeStates[oldLibName + ' favorites'] del self.treeStates[oldLibName + ' favorites'] # --== Favorites ==-- def loadFavorites(self, libName): """ Load favorites from the disk """ try: return pickleLoad(os.path.join(ROOT_PATH, libName, 'favorites')) except: return {} def saveFavorites(self, libName, favorites): """ Save favorites to the disk """ pickleSave(os.path.join(ROOT_PATH, libName, 'favorites'), favorites) def isArtistInFavorites(self, artist): """ Return whether the given artist is in the favorites (at least one album) """ return artist in self.favorites def isAlbumInFavorites(self, artist, album): """ Return whether the given album is in the favorites """ return artist in self.favorites and album in self.favorites[artist] def addToFavorites(self, artist, album): """ Add the given album to the favorites """ if artist in self.favorites: self.favorites[artist][album] = None else: self.favorites[artist] = {album: None} def removeFromFavorites(self, artist, album): """ Remove the given album from the favorites """ del self.favorites[artist][album] if len(self.favorites[artist]) == 0: del self.favorites[artist] # --== GTK handlers ==-- def onRowExpanded(self, tree, node): """ Populate the expanded row """ if tree.getItem(node, ROW_TYPE) == TYPE_ARTIST: self.loadAlbums(tree, node, tree.getChild(node, 0)) else: self.loadTracks(tree, node, tree.getChild(node, 0)) def onRowCollapsed(self, tree, node): """ Replace all children of the node by a fake child """ tree.removeAllChildren(node) tree.appendRow(FAKE_CHILD, node) def onButtonPressed(self, tree, event, path): """ A mouse button has been pressed """ if event.button == 3: self.showPopupMenu(tree, event.button, event.time, path) elif path is not None and tree.getItem(path, ROW_TYPE) != TYPE_NONE: if event.button == 2: self.playPaths(tree, [path], False) elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: if tree.getItem(path, ROW_PIXBUF) != icons.dirMenuIcon(): self.playPaths(tree, None, True) elif tree.row_expanded(path): tree.collapse_row(path) else: tree.expand_row(path, False) def onKeyPressed(self, tree, event): """ A key has been pressed """ keyname = gtk.gdk.keyval_name(event.keyval) if keyname == 'F5': idle_add(self.refreshLibrary(None, self.currLib, self.libraries[self.currLib][LIB_PATH]).next) elif keyname == 'plus': tree.expandRows() elif keyname == 'Left': tree.collapseRows() elif keyname == 'Right': tree.expandRows() elif keyname == 'minus': tree.collapseRows() elif keyname == 'space': tree.switchRows() elif keyname == 'Return': self.playPaths(tree, None, True) def onDragDataGet(self, tree, context, selection, info, time): """ Provide information about the data being dragged """ serializedTracks = '\n'.join([track.serialize() for track in self.__getTracksFromPaths(tree, None)]) selection.set(consts.DND_TARGETS[consts.DND_DAP_TRACKS][0], 8, serializedTracks) def addAllExplorers(self): """ Add all libraries to the Explorer module """ for (name, (path, nbArtists, nbAlbums, nbTracks)) in self.libraries.iteritems(): modules.postMsg(consts.MSG_CMD_EXPLORER_ADD, {'modName': MOD_L10N, 'expName': name, 'icon': icons.dirMenuIcon(), 'widget': self.scrolled}) def removeAllExplorers(self): """ Remove all libraries from the Explorer module """ for (name, (path, nbArtists, nbAlbums, nbTracks)) in self.libraries.iteritems(): modules.postMsg(consts.MSG_CMD_EXPLORER_REMOVE, {'modName': MOD_L10N, 'expName': name}) # --== Message handlers ==-- def onModLoaded(self): """ This is the real initialization function, called when the module has been loaded """ self.tree = None self.currLib = None self.cfgWindow = None self.libraries = prefs.get(__name__, 'libraries', PREFS_DEFAULT_LIBRARIES) self.favorites = None self.treeStates = prefs.get(__name__, 'tree-state', PREFS_DEFAULT_TREE_STATE) self.showOnlyFavorites = prefs.get(__name__, 'show-only-favorites', PREFS_DEFAULT_SHOW_ONLY_FAVORITES) # Scroll window self.scrolled = gtk.ScrolledWindow() self.scrolled.set_shadow_type(gtk.SHADOW_IN) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.scrolled.show() idle_add(self.addAllExplorers) def onModUnloaded(self): """ The module has been unloaded """ if self.currLib is not None: self.saveTreeState() self.saveFavorites(self.currLib, self.favorites) prefs.set(__name__, 'tree-state', self.treeStates) prefs.set(__name__, 'libraries', self.libraries) self.removeAllExplorers() def onExplorerChanged(self, modName, expName): """ A new explorer has been selected """ if modName == MOD_L10N and expName != self.currLib: # Create the tree if needed if self.tree is None: self.__createTree() # Save the state of the current library if self.currLib is not None: self.saveTreeState() self.saveFavorites(self.currLib, self.favorites) # Switch to the new library self.currLib = expName self.favorites = self.loadFavorites(self.currLib) self.loadArtists(self.tree, self.currLib) self.restoreTreeState() # --== Configuration ==-- def configure(self, parent): """ Show the configuration dialog """ if self.cfgWindow is None: from gui import extListview, window self.cfgWindow = window.Window('Library.glade', 'vbox1', __name__, MOD_L10N, 370, 400) # Create the list of libraries txtRdr = gtk.CellRendererText() pixRdr = gtk.CellRendererPixbuf() columns = ((None, [(txtRdr, TYPE_STRING)], 0, False, False), ('', [(pixRdr, gtk.gdk.Pixbuf), (txtRdr, TYPE_STRING)], 2, False, True)) self.cfgList = extListview.ExtListView(columns, sortable=False, useMarkup=True, canShowHideColumns=False) self.cfgList.set_headers_visible(False) self.cfgWindow.getWidget('scrolledwindow1').add(self.cfgList) # Connect handlers self.cfgList.connect('key-press-event', self.onCfgKeyboard) self.cfgList.get_selection().connect('changed', self.onCfgSelectionChanged) self.cfgWindow.getWidget('btn-add').connect('clicked', self.onAddLibrary) self.cfgWindow.getWidget('btn-rename').connect('clicked', self.onRenameLibrary) self.cfgWindow.getWidget('btn-remove').connect('clicked', lambda btn: self.removeSelectedLibraries(self.cfgList)) self.cfgWindow.getWidget('btn-refresh').connect('clicked', self.onRefresh) self.cfgWindow.getWidget('btn-ok').connect('clicked', lambda btn: self.cfgWindow.hide()) self.cfgWindow.getWidget('btn-cancel').connect('clicked', lambda btn: self.cfgWindow.hide()) self.cfgWindow.getWidget('btn-help').connect('clicked', self.onHelp) if not self.cfgWindow.isVisible(): self.fillLibraryList() self.cfgWindow.getWidget('btn-ok').grab_focus() self.cfgWindow.show() def onRefresh(self, btn): """ Refresh the first selected library """ name = self.cfgList.getSelectedRows()[0][0] idle_add(self.refreshLibrary(self.cfgWindow, name, self.libraries[name][LIB_PATH]).next) def onAddLibrary(self, btn): """ Let the user create a new library """ from gui.selectPath import SelectPath result = SelectPath(MOD_L10N, self.cfgWindow, self.libraries.keys(), ['/']).run() if result is not None: name, path = result idle_add(self.refreshLibrary(self.cfgWindow, name, path, True).next) def renameLibrary(self, oldName, newName): """ Rename a library """ import shutil self.libraries[newName] = self.libraries[oldName] del self.libraries[oldName] oldPath = os.path.join(ROOT_PATH, oldName) newPath = os.path.join(ROOT_PATH, newName) shutil.move(oldPath, newPath) # Rename tree states as well self.renameTreeStates(oldName, newName) # Is it the current library? if self.currLib == oldName: self.currLib = newName modules.postMsg(consts.MSG_CMD_EXPLORER_RENAME, {'modName': MOD_L10N, 'expName': oldName, 'newExpName': newName}) def onRenameLibrary(self, btn): """ Let the user rename a library """ from gui.selectPath import SelectPath name = self.cfgList.getSelectedRows()[0][0] forbidden = [libName for libName in self.libraries if libName != name] pathSelector = SelectPath(MOD_L10N, self.cfgWindow, forbidden, ['/']) pathSelector.setPathSelectionEnabled(False) result = pathSelector.run(name, self.libraries[name][LIB_PATH]) if result is not None and result[0] != name: self.renameLibrary(name, result[0]) self.fillLibraryList() def fillLibraryList(self): """ Fill the list of libraries """ if self.cfgWindow is not None: rows = [(name, icons.dirBtnIcon(), '%s\n%s - %u %s' % (htmlEscape(name), htmlEscape(path), nbTracks, htmlEscape(_('tracks')))) for name, (path, nbArtists, nbAlbums, nbTracks) in sorted(self.libraries.iteritems())] self.cfgList.replaceContent(rows) def removeSelectedLibraries(self, list): """ Remove all selected libraries """ import shutil from gui import questionMsgBox if list.getSelectedRowsCount() == 1: remark = _('You will be able to recreate this library later on if you wish so.') question = _('Remove the selected library?') else: remark = _('You will be able to recreate these libraries later on if you wish so.') question = _('Remove all selected libraries?') if questionMsgBox(self.cfgWindow, question, '%s %s' % (_('Your media files will not be removed.'), remark)) == gtk.RESPONSE_YES: for row in list.getSelectedRows(): libName = row[0] if self.currLib == libName: self.currLib = None # Remove the library from the disk libPath = os.path.join(ROOT_PATH, libName) if isdir(libPath): shutil.rmtree(libPath) # Remove the corresponding explorer modules.postMsg(consts.MSG_CMD_EXPLORER_REMOVE, {'modName': MOD_L10N, 'expName': libName}) del self.libraries[libName] # Remove tree states self.removeTreeStates(libName) # Clean up the listview list.removeSelectedRows() def onCfgKeyboard(self, list, event): """ Remove the selection if possible """ if gtk.gdk.keyval_name(event.keyval) == 'Delete': self.removeSelectedLibraries(list) def onCfgSelectionChanged(self, selection): """ The selection has changed, update the status of the buttons """ self.cfgWindow.getWidget('btn-remove').set_sensitive(selection.count_selected_rows() != 0) self.cfgWindow.getWidget('btn-rename').set_sensitive(selection.count_selected_rows() == 1) self.cfgWindow.getWidget('btn-refresh').set_sensitive(selection.count_selected_rows() == 1) def onHelp(self, btn): """ Display a small help message box """ from gui import help helpDlg = help.HelpDlg(MOD_L10N) helpDlg.addSection(_('Description'), _('This module organizes your media files by tags instead of using the file structure of your drive. ' 'Loading tracks is also faster because their tags are already known and do not have to be read again.')) helpDlg.addSection(_('Usage'), _('When you add a new library, you have to give the full path to the root directory of that library. ' 'Then, all directories under this root path are recursively scanned for media files whose tags are read ' 'and stored in a database.') + '\n\n' + _('Upon refreshing a library, the file structure under the root ' 'directory and all media files are scanned for changes, to update the database accordingly.')) helpDlg.show(self.cfgWindow) ./decibel-audio-player-1.06/src/tools/0000755000175000017500000000000011456551413017713 5ustar ingelresingelres./decibel-audio-player-1.06/src/tools/__init__.py0000644000175000017500000001406111456551413022026 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import consts, cPickle, gtk, gtk.glade, os __dirCache = {} def listDir(directory, listHiddenFiles=False): """ Return a list of tuples (filename, path) with the given directory content The dircache module sorts the list of files, and either it's not needed or it's not sorted the way we want """ if directory in __dirCache: cachedMTime, list = __dirCache[directory] else: cachedMTime, list = None, None if os.path.exists(directory): mTime = os.stat(directory).st_mtime else: mTime = 0 if mTime != cachedMTime: # Make sure it's readable if os.access(directory, os.R_OK | os.X_OK): list = os.listdir(directory) else: list = [] __dirCache[directory] = (mTime, list) return [(filename, os.path.join(directory, filename)) for filename in list if listHiddenFiles or filename[0] != '.'] __downloadCache = {} def cleanupDownloadCache(): """ Remove temporary downloaded files """ for (cachedTime, file) in __downloadCache.itervalues(): try: os.remove(file) except: pass def downloadFile(url, cacheTimeout=3600): """ If the file has been in the cache for less than 'cacheTimeout' seconds, return the cached file Otherwise download the file and cache it Return a tuple (errorMsg, data) where data is None if an error occurred, errorMsg containing the error message in this case """ import socket, tempfile, time, urllib2 if url in __downloadCache: cachedTime, file = __downloadCache[url] else: cachedTime, file = -cacheTimeout, None now = int(time.time()) # If the timeout is not exceeded, get the data from the cache if (now - cachedTime) <= cacheTimeout: try: input = open(file, 'rb') data = input.read() input.close() return ('', data) except: # If something went wrong with the cache, proceed to download pass # Make sure to not be blocked by the request socket.setdefaulttimeout(consts.socketTimeout) try: # Retrieve the data request = urllib2.Request(url) stream = urllib2.urlopen(request) data = stream.read() # Do we need to create a new temporary file? if file is None: handle, file = tempfile.mkstemp() os.close(handle) # On first file added to the cache, we register our clean up function if len(__downloadCache) == 0: import atexit atexit.register(cleanupDownloadCache) __downloadCache[url] = (now, file) output = open(file, 'wb') output.write(data) output.close() return ('', data) except urllib2.HTTPError, err: return ('The request failed with error code %u' % err.code, None) except: return ('The request failed', None) return ('Unknown error', None) def sec2str(seconds, alwaysShowHours=False): """ Return a formatted string based on the given duration in seconds """ hours, seconds = divmod(seconds, 3600) minutes, seconds = divmod(seconds, 60) if alwaysShowHours or hours != 0: return '%u:%02u:%02u' % (hours, minutes, seconds) else: return '%u:%02u' % (minutes, seconds) def loadGladeFile(file, root=None): """ Load the given Glade file and return the tree of widgets """ if root is None: return gtk.glade.XML(os.path.join(consts.dirRes, file), domain=consts.appNameShort) else: return gtk.glade.XML(os.path.join(consts.dirRes, file), root, consts.appNameShort) def pickleLoad(file): """ Use cPickle to load the data structure stored in the given file """ input = open(file, 'r') data = cPickle.load(input) input.close() return data def pickleSave(file, data): """ Use cPickle to save the data to the given file """ output = open(file, 'w') cPickle.dump(data, output) output.close() def touch(filePath): """ Equivalent to the Linux 'touch' command """ os.system('touch "%s"' % filePath) def percentEncode(string): """ Percent-encode all the bytes in the given string Couldn't find a Python method to do that """ mask = '%%%X' * len(string) bytes = tuple([ord(c) for c in string]) return mask % bytes def getCursorPosition(): """ Return a tuple (x, y) """ cursorNfo = gtk.gdk.display_get_default().get_pointer() return (cursorNfo[1], cursorNfo[2]) def htmlEscape(string): """ Replace characters &, <, and > by their equivalent HTML code """ output = '' for c in string: if c == '&': output += '&' elif c == '<': output += '<' elif c == '>': output += '>' else: output += c return output def splitPath(path): """ Return a list composed of all the elements forming the given path For instance, splitPath('/some/path/foo') returns ['some', 'path', 'foo'] """ path = os.path.abspath(path) components = [] while True: head, tail = os.path.split(path) if tail == '': return [head] + components else: path = head components = [tail] + components ./decibel-audio-player-1.06/src/tools/prefs.py0000644000175000017500000000376311456551413021415 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os, threading, tools # Load user preferences from the disk try: __usrPrefs = tools.pickleLoad(tools.consts.filePrefs) except: __usrPrefs = {} __mutex = threading.Lock() # Prevent concurrent calls to functions __appGlobals = {} # Some global values shared by all the components of the application def save(): """ Save user preferences to the disk """ __mutex.acquire() tools.pickleSave(tools.consts.filePrefs, __usrPrefs) os.chmod(tools.consts.filePrefs, 0600) __mutex.release() def set(module, name, value): """ Change the value of a preference """ __mutex.acquire() __usrPrefs[module + '_' + name] = value; __mutex.release() def get(module, name, default=None): """ Retrieve the value of a preference """ __mutex.acquire() try: value = __usrPrefs[module + '_' + name] except: value = default __mutex.release() return value # Command line used to start the application def setCmdLine(cmdLine): __appGlobals['cmdLine'] = cmdLine def getCmdLine(): return __appGlobals['cmdLine'] # Main widgets' tree created by Glade def setWidgetsTree(tree): __appGlobals['wTree'] = tree def getWidgetsTree(): return __appGlobals['wTree'] ./decibel-audio-player-1.06/src/tools/log.py0000644000175000017500000000244711456551413021055 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import consts class Logger: def __init__(self, filename): """ Constructor """ self.handler = open(filename, 'wt') def __log(self, msgType, msg): """ Private logging function """ self.handler.write('%-6s %s\n' % (msgType, msg)) self.handler.flush() def info(self, msg): """ Information message """ self.__log('INFO', msg) def error(self, msg): """ Error message """ self.__log('ERROR', msg) logger = Logger(consts.fileLog) ./decibel-audio-player-1.06/src/tools/consts.py0000644000175000017500000002122211456551413021575 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, os.path, random, time from gettext import gettext as _ # --- Not a constant, but it fits well here random.seed(int(time.time())) # --- Miscellaneous socketTimeout = 10 # --- Strings appName = 'Decibel Audio Player' appVersion = '1.06' appNameShort = 'decibel-audio-player' # --- URLs urlMain = 'http://decibel.silent-blade.org' urlHelp = 'http://decibel.silent-blade.org/index.php?n=Main.Help' # --- Directories dirBaseUsr = os.path.expanduser('~') dirBaseCfg = os.path.join(dirBaseUsr, '.config') dirBaseSrc = os.path.join(os.path.dirname(__file__), '..') dirRes = os.path.join(dirBaseSrc, '..', 'res') dirDoc = os.path.join(dirBaseSrc, '..', 'doc') dirPix = os.path.join(dirBaseSrc, '..', 'pix') dirCfg = os.path.join(dirBaseCfg, appNameShort) dirLog = os.path.join(dirCfg, 'Logs') dirLocale = os.path.join(dirBaseSrc, '..', 'locale') if not os.path.isdir(dirLocale) : dirLocale = os.path.join(dirBaseSrc, '..', '..', 'locale') # Make sure the config directory exists if not os.path.exists(dirBaseCfg): os.mkdir(dirBaseCfg) if not os.path.exists(dirCfg): os.mkdir(dirCfg) # Make sure the log directory exists if not os.path.exists(dirLog): os.mkdir(dirLog) # --- Icons fileImgIcon16 = os.path.join(dirPix, 'decibel-audio-player-16.png') fileImgIcon24 = os.path.join(dirPix, 'decibel-audio-player-24.png') fileImgIcon32 = os.path.join(dirPix, 'decibel-audio-player-32.png') fileImgIcon48 = os.path.join(dirPix, 'decibel-audio-player-48.png') fileImgIcon64 = os.path.join(dirPix, 'decibel-audio-player-64.png') fileImgIcon128 = os.path.join(dirPix, 'decibel-audio-player-128.png') fileImgStar16 = os.path.join(dirPix, 'star-16.png') fileImgCatAll = os.path.join(dirPix, 'category-all.png') fileImgCatDesktop = os.path.join(dirPix, 'category-desktop.png') fileImgCatDecibel = os.path.join(dirPix, 'category-decibel.png') fileImgCatExplorer = os.path.join(dirPix, 'category-explorer.png') fileImgCatInternet = os.path.join(dirPix, 'category-internet.png') # --- Files fileLog = os.path.join(dirLog, 'log') filePrefs = os.path.join(dirCfg, 'prefs.txt') fileLicense = os.path.join(dirDoc, 'LICENCE') # --- DBus constants dbusService = 'org.mpris.dap' dbusInterface = 'org.freedesktop.MediaPlayer' # --- Tracks UNKNOWN_DATE = 0 UNKNOWN_GENRE = _('Unknown Genre') UNKNOWN_TITLE = _('Unknown Title') UNKNOWN_ALBUM = _('Unknown Album') UNKNOWN_ARTIST = _('Unknown Artist') UNKNOWN_LENGTH = 0 UNKNOWN_BITRATE = 0 UNKNOWN_ENC_MODE = 0 UNKNOWN_MB_TRACKID = 0 UNKNOWN_DISC_NUMBER = 0 UNKNOWN_SAMPLE_RATE = 0 UNKNOWN_TRACK_NUMBER = 0 UNKNOWN_ALBUM_ARTIST = _('Unknown Album Artist') # --- Drag'n'Drop ( DND_URI, # From another application (e.g., from Nautilus) DND_DAP_URI, # Inside DAP when tags are not known (e.g., from the FileExplorer) DND_DAP_TRACKS # Inside DAP when tags are already known (e.g., from the Library) ) = range(3) DND_TARGETS = { DND_URI: ('text/uri-list', 0, DND_URI), DND_DAP_URI: ('dap/uri-list', gtk.TARGET_SAME_APP, DND_DAP_URI), DND_DAP_TRACKS: ('dap/tracks-list', gtk.TARGET_SAME_APP, DND_DAP_TRACKS) } # --- View modes ( VIEW_MODE_FULL, VIEW_MODE_MINI, VIEW_MODE_PLAYLIST, ) = range(3) # -- Categories a module can belong to ( MODCAT_NONE, MODCAT_DECIBEL, MODCAT_DESKTOP, MODCAT_INTERNET, MODCAT_EXPLORER, ) = range(5) # --- Message that can be sent/received by modules # --- A message is always associated with a (potentially empty) dictionnary containing its parameters ( # --== COMMANDS ==-- # GStreamer player MSG_CMD_PLAY, # Play a resource Parameters: 'uri' MSG_CMD_STOP, # Stop playing Parameters: MSG_CMD_SEEK, # Jump to a position Parameters: 'seconds' MSG_CMD_STEP, # Step back or forth Parameters: 'seconds' MSG_CMD_SET_VOLUME, # Change the volume Parameters: 'value' MSG_CMD_BUFFER, # Buffer a file Parameters: 'filename' MSG_CMD_TOGGLE_PAUSE, # Toggle play/pause Parameters: MSG_CMD_ENABLE_EQZ, # Enable the equalizer Parameters: MSG_CMD_SET_EQZ_LVLS, # Set the levels of the 10-bands equalizer Parameters: 'lvls' MSG_CMD_ENABLE_RG, # Enable ReplayGain Parameters: MSG_CMD_SET_CD_SPEED, # Change drive speed when reading a CD Parameters: 'speed' # Tracklist MSG_CMD_NEXT, # Play the next track Parameters: MSG_CMD_PREVIOUS, # Play the previous track Parameters: MSG_CMD_TRACKLIST_SET, # Replace tracklist Parameters: 'tracks', 'playNow' MSG_CMD_TRACKLIST_ADD, # Extend tracklist Parameters: 'tracks', 'playNow' MSG_CMD_TRACKLIST_DEL, # Remove a track Parameters: 'idx' MSG_CMD_TRACKLIST_CLR, # Clear tracklist Parameters: MSG_CMD_TRACKLIST_SHUFFLE, # Shuffle the tracklist Parameters: MSG_CMD_TRACKLIST_REPEAT, # Set/Unset the repeat function Parameters: 'repeat' # Explorers MSG_CMD_EXPLORER_ADD, # Add a new explorer Parameters: 'modName', 'expName', 'icon', 'widget' MSG_CMD_EXPLORER_REMOVE, # Remove an explorer Parameters: 'modName', 'expName' MSG_CMD_EXPLORER_RENAME, # Rename an explorer Parameters: 'modName', 'expName', 'newExpName' # Covers MSG_CMD_SET_COVER, # Cover file for the given track Parameters: 'track', 'pathThumbnail', 'pathFullSize' # Misc MSG_CMD_THREAD_EXECUTE, # An *internal* command for threaded modules Parameters: N/A # --== EVENTS ==-- # Current track MSG_EVT_PAUSED, # Paused Parameters: MSG_EVT_STOPPED, # Stopped Parameters: MSG_EVT_UNPAUSED, # Unpaused Parameters: MSG_EVT_NEW_TRACK, # The current track has changed Parameters: 'track' MSG_EVT_NEED_BUFFER, # The next track should be buffered Parameters: MSG_EVT_TRACK_POSITION, # New position in the current track Parameters: 'seconds' MSG_EVT_TRACK_ENDED_OK, # The current track has ended Parameters: MSG_EVT_TRACK_ENDED_ERROR, # The current track has ended because of an error Parameters: # GStreamer player MSG_EVT_VOLUME_CHANGED, # The volume has changed Parameters: 'value' # Tracklist MSG_EVT_TRACK_MOVED, # The position of the current track has changed Parameters: 'hasPrevious', 'hasNext' MSG_EVT_NEW_TRACKLIST, # A new tracklist has been set Parameters: 'tracks', 'playtime' MSG_EVT_REPEAT_CHANGED, # The repeat function has been enabled/disabled Parameters: 'repeat' MSG_EVT_TRACKLIST_NEW_SEL, # The tracklist has a new set of selected tracks Parameters: 'tracks' # Application MSG_EVT_APP_QUIT, # The application is quitting Parameters: MSG_EVT_APP_STARTED, # The application has just started Parameters: # Modules MSG_EVT_MOD_LOADED, # The module has been loaded by request of the user Parameters: MSG_EVT_MOD_UNLOADED, # The module has been unloaded by request of the user Parameters: # Explorer manager MSG_EVT_EXPLORER_CHANGED, # A new explorer has been selected Parameters: 'modName', 'expName' # End value MSG_END_VALUE ) = range(43) ./decibel-audio-player-1.06/src/tools/icons.py0000644000175000017500000001233711456551413021406 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk from tools import consts __lbl = None __dirBtnIcon = None __dirMenuIcon = None __starMenuIcon = None __prefsBtnIcon = None __nullMenuIcon = None __playMenuIcon = None __pauseMenuIcon = None __cdromMenuIcon = None __errorMenuIcon = None __starDirMenuIcon = None __mediaDirMenuIcon = None __mediaFileMenuIcon = None __catDesktopIcon = None __catDecibelIcon = None __catExplorerIcon = None __catInternetIcon = None def __render(stock, size): """ Return the given stock icon rendered at the given size """ global __lbl if __lbl is None: __lbl = gtk.Label() return __lbl.render_icon(stock, size) def dirMenuIcon(): """ Directories """ global __dirMenuIcon if __dirMenuIcon is None: __dirMenuIcon = __render(gtk.STOCK_DIRECTORY, gtk.ICON_SIZE_MENU) return __dirMenuIcon def dirBtnIcon(): """ Directories """ global __dirBtnIcon if __dirBtnIcon is None: __dirBtnIcon = __render(gtk.STOCK_DIRECTORY, gtk.ICON_SIZE_BUTTON) return __dirBtnIcon def prefsBtnIcon(): """ Preferences """ global __prefsBtnIcon if __prefsBtnIcon is None: __prefsBtnIcon = __render(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_BUTTON) return __prefsBtnIcon def playMenuIcon(): """ Play """ global __playMenuIcon if __playMenuIcon is None: __playMenuIcon = __render(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU) return __playMenuIcon def pauseMenuIcon(): """ Pause """ global __pauseMenuIcon if __pauseMenuIcon is None: __pauseMenuIcon = __render(gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU) return __pauseMenuIcon def cdromMenuIcon(): """ CD-ROM """ global __cdromMenuIcon if __cdromMenuIcon is None: __cdromMenuIcon = __render(gtk.STOCK_CDROM, gtk.ICON_SIZE_MENU) return __cdromMenuIcon def starMenuIcon(): """ Star """ global __starMenuIcon if __starMenuIcon is None: __starMenuIcon = gtk.gdk.pixbuf_new_from_file(consts.fileImgStar16) return __starMenuIcon def errorMenuIcon(): """ Error """ global __errorMenuIcon if __errorMenuIcon is None: __errorMenuIcon = __render(gtk.STOCK_CANCEL, gtk.ICON_SIZE_MENU) return __errorMenuIcon def nullMenuIcon(): """ Transparent icon """ global __nullMenuIcon if __nullMenuIcon is None: __nullMenuIcon = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, 16, 16) __nullMenuIcon.fill(0x00000000) return __nullMenuIcon def mediaDirMenuIcon(): """ Media directory """ global __mediaDirMenuIcon if __mediaDirMenuIcon is None: __mediaDirMenuIcon = dirMenuIcon().copy() # We need a copy to modify it cdromMenuIcon().composite(__mediaDirMenuIcon, 5, 5, 11, 11, 5, 5, 0.6875, 0.6875, gtk.gdk.INTERP_HYPER, 255) return __mediaDirMenuIcon def starDirMenuIcon(): """ Starred directory """ global __starDirMenuIcon if __starDirMenuIcon is None: __starDirMenuIcon = dirMenuIcon().copy() # We need a copy to modify it starMenuIcon().composite(__starDirMenuIcon, 5, 5, 11, 11, 5, 5, 0.6875, 0.6875, gtk.gdk.INTERP_HYPER, 255) return __starDirMenuIcon def mediaFileMenuIcon(): """ Media file """ global __mediaFileMenuIcon if __mediaFileMenuIcon is None: __mediaFileMenuIcon = __render(gtk.STOCK_FILE, gtk.ICON_SIZE_MENU).copy() # We need a copy to modify it cdromMenuIcon().composite(__mediaFileMenuIcon, 5, 5, 11, 11, 5, 5, 0.6875, 0.6875, gtk.gdk.INTERP_HYPER, 255) return __mediaFileMenuIcon def catDecibelIcon(): """ Directories """ global __catDecibelIcon if __catDecibelIcon is None: __catDecibelIcon = gtk.gdk.pixbuf_new_from_file(consts.fileImgCatDecibel) return __catDecibelIcon def catDesktopIcon(): """ Directories """ global __catDesktopIcon if __catDesktopIcon is None: __catDesktopIcon = gtk.gdk.pixbuf_new_from_file(consts.fileImgCatDesktop) return __catDesktopIcon def catInternetIcon(): """ Directories """ global __catInternetIcon if __catInternetIcon is None: __catInternetIcon = gtk.gdk.pixbuf_new_from_file(consts.fileImgCatInternet) return __catInternetIcon def catExplorerIcon(): """ Directories """ global __catExplorerIcon if __catExplorerIcon is None: __catExplorerIcon = gtk.gdk.pixbuf_new_from_file(consts.fileImgCatExplorer) return __catExplorerIcon ./decibel-audio-player-1.06/src/media/0000755000175000017500000000000011456551413017632 5ustar ingelresingelres./decibel-audio-player-1.06/src/media/__init__.py0000644000175000017500000000750011456551413021745 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os, playlist, traceback from format import monkeysaudio, asf, flac, mp3, mp4, mpc, ogg, wavpack from os.path import splitext from tools.log import logger from track.fileTrack import FileTrack # Supported formats with associated modules mFormats = {'.ac3': monkeysaudio, '.ape': monkeysaudio, '.flac': flac, '.m4a': mp4, '.mp2': mp3, '.mp3': mp3, '.mp4': mp4, '.mpc': mpc,'.oga': ogg, '.ogg': ogg, '.wma': asf, '.wv': wavpack} def isSupported(file): """ Return True if the given file is a supported format """ try: return splitext(file.lower())[1] in mFormats except: return False def getSupportedFormats(): """ Return a list of all formats from which tags can be extracted """ return ['*' + ext for ext in mFormats] def getTrackFromFile(file): """ Return a Track object, based on the tags of the given file The 'file' parameter must be a real file (not a playlist or a directory) """ try: return mFormats[splitext(file.lower())[1]].getTrack(file) except: logger.error('Unable to extract information from %s\n\n%s' % (file, traceback.format_exc())) return FileTrack(file) def getTracksFromFiles(files): """ Same as getTrackFromFile(), but works on a list of files instead of a single one """ return [getTrackFromFile(file) for file in files] def getTracks(filenames, sortByFilename=False, ignoreHiddenFiles=True): """ Same as getTracksFromFiles(), but works for any kind of filenames (files, playlists, directories) If sortByFilename is True, files loaded from directories are sorted by filename instead of tags If ignoreHiddenFiles is True, hidden files are ignored when walking directories """ allTracks = [] # Directories for directory in [filename for filename in filenames if os.path.isdir(filename)]: mediaFiles, playlists = [], [] for root, subdirs, files in os.walk(directory): for file in files: if not ignoreHiddenFiles or file[0] != '.': if isSupported(file): mediaFiles.append(os.path.join(root, file)) elif playlist.isSupported(file): playlists.append(os.path.join(root, file)) if sortByFilename: allTracks.extend(sorted(getTracksFromFiles(mediaFiles), lambda t1, t2: cmp(t1.getFilePath(), t2.getFilePath()))) else: allTracks.extend(sorted(getTracksFromFiles(mediaFiles))) for pl in playlists: allTracks.extend(getTracksFromFiles(playlist.load(pl))) # Files tracks = getTracksFromFiles([filename for filename in filenames if os.path.isfile(filename) and isSupported(filename)]) if sortByFilename: allTracks.extend(sorted(tracks, lambda t1, t2: cmp(t1.getFilePath(), t2.getFilePath()))) else: allTracks.extend(sorted(tracks)) # Playlists for pl in [filename for filename in filenames if os.path.isfile(filename) and playlist.isSupported(filename)]: allTracks.extend(getTracksFromFiles(playlist.load(pl))) return allTracks ./decibel-audio-player-1.06/src/media/playlist.py0000644000175000017500000000336411456551413022053 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import media, os.path def isSupported(file): """ Return True if the file has a supported format """ return file.lower()[-4:] == '.m3u' def getSupportedFormats(): """ Return a list of supported playlist formats """ return ['*.m3u'] def save(files, playlist): """ Create a playlist with the given files """ output = open(playlist, 'w') output.writelines('\n'.join(files)) output.close() def load(playlist): """ Return the list of files loaded from the given playlist """ if not os.path.isfile(playlist): return [] input = open(playlist) files = [line for line in [line.strip() for line in input] if len(line) != 0 and line[0] != '#'] input.close() path = os.path.dirname(playlist) for i, file in enumerate(files): if not os.path.isabs(file): files[i] = os.path.join(path, file.replace('\\', '/')) return [file for file in files if os.path.isfile(file) and media.isSupported(file)] ./decibel-audio-player-1.06/src/media/audioplayer.py0000644000175000017500000001717511456551413022535 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gst class AudioPlayer: def __init__(self, callbackEnded, usePlaybin2=True): """ Constructor """ self.player = None self.volume = 1 self.rgEnabled = False self.eqzLevels = None self.equalizer = None self.eqzEnabled = False self.usePlaybin2 = usePlaybin2 self.cdReadSpeed = 1 self.callbackEnded = callbackEnded def __getPlayer(self): """ Construct and return the GStreamer player """ self.__constructPlayer() self.__getPlayer = self.__getPlayer_post # I love Python return self.player def __getPlayer_post(self): """ Return the GStreamer player """ return self.player def __constructPlayer(self): """ Create the GStreamer pipeline """ if self.usePlaybin2: self.player = gst.element_factory_make('playbin2', 'player') self.player.connect('about-to-finish', self.__onAboutToFinish) else: self.player = gst.element_factory_make('playbin', 'player') # No video self.player.set_property('video-sink', gst.element_factory_make('fakesink', 'fakesink')) # Restore volume self.player.set_property('volume', self.volume) # Change the audio sink to our own bin, so that an equalizer/replay gain element can be added later on if needed self.audiobin = gst.Bin('audiobin') self.audiosink = gst.element_factory_make('autoaudiosink', 'audiosink') # Callback when the source of the playbin is changed self.player.connect('notify::source', self.__onNewPlaybinSource) self.audiobin.add(self.audiosink) self.audiobin.add_pad(gst.GhostPad('sink', self.audiosink.get_pad('sink'))) self.player.set_property('audio-sink', self.audiobin) # Monitor messages generated by the player bus = self.player.get_bus() bus.add_signal_watch() bus.connect('message', self.__onGstMessage) # Add equalizer? if self.eqzEnabled: self.equalizer = gst.element_factory_make('equalizer-10bands', 'equalizer') self.audiobin.add(self.equalizer) self.audiobin.get_pad('sink').set_target(self.equalizer.get_pad('sink')) self.equalizer.link(self.audiosink) if self.eqzLevels is not None: self.setEqualizerLvls(self.eqzLevels) # Add replay gain? if self.rgEnabled: replaygain = gst.element_factory_make('rgvolume', 'replaygain') self.audiobin.add(replaygain) self.audiobin.get_pad('sink').set_target(replaygain.get_pad('sink')) if self.equalizer is None: replaygain.link(self.audiosink) else: replaygain.link(self.equalizer) def enableEqualizer(self): """ Add an equalizer to the audio chain """ self.eqzEnabled = True def enableReplayGain(self): """ Add/Enable a replay gain element """ self.rgEnabled = True def setEqualizerLvls(self, lvls): """ Set the level of the 10-bands of the equalizer (levels must be a list/tuple with 10 values lying between -24 and +12) """ if len(lvls) == 10: self.eqzLevels = lvls if self.equalizer is not None: self.equalizer.set_property('band0', lvls[0]) self.equalizer.set_property('band1', lvls[1]) self.equalizer.set_property('band2', lvls[2]) self.equalizer.set_property('band3', lvls[3]) self.equalizer.set_property('band4', lvls[4]) self.equalizer.set_property('band5', lvls[5]) self.equalizer.set_property('band6', lvls[6]) self.equalizer.set_property('band7', lvls[7]) self.equalizer.set_property('band8', lvls[8]) self.equalizer.set_property('band9', lvls[9]) def __onNewPlaybinSource(self, playbin, params): """ Change the CR-ROM drive speed to 1 when applicable """ source = self.__getPlayer().get_by_name('source') # Didn't find a way to determine the real class of source # So we use the 'paranoia-mode' property to determine whether it's indeed a CD we're playing try: source.get_property('paranoia-mode') source.set_property('read-speed', self.cdReadSpeed) except: pass def __onAboutToFinish(self, isLast): """ End of the track """ self.callbackEnded(False) def __onGstMessage(self, bus, msg): """ A new message generated by the player """ if msg.type == gst.MESSAGE_EOS: self.callbackEnded(False) elif msg.type == gst.MESSAGE_ERROR: self.stop() # It seems that the pipeline may not be able to play again any valid stream when an error occurs # We thus create a new one, even if that's quite a ugly solution self.__constructPlayer() self.callbackEnded(True) return True def setCDReadSpeed(self, speed): """ Set the CD-ROM drive read speed """ self.cdReadSpeed = speed def setNextURI(self, uri): """ Set the next URI """ self.__getPlayer().set_property('uri', uri.replace('%', '%25').replace('#', '%23')) def setVolume(self, level): """ Set the volume to the given level (0 <= level <= 1) """ if level < 0: self.volume = 0 elif level > 1: self.volume = 1 else: self.volume = level if self.player is not None: self.player.set_property('volume', self.volume) def isPaused(self): """ Return whether the player is paused """ return self.__getPlayer().get_state()[1] == gst.STATE_PAUSED def isPlaying(self): """ Return whether the player is paused """ return self.__getPlayer().get_state()[1] == gst.STATE_PLAYING def setURI(self, uri): """ Play the given URI """ self.__getPlayer().set_property('uri', uri.replace('%', '%25').replace('#', '%23')) def play(self): """ Play """ self.__getPlayer().set_state(gst.STATE_PLAYING) def pause(self): """ Pause """ self.__getPlayer().set_state(gst.STATE_PAUSED) def stop(self): """ Stop playing """ self.__getPlayer().set_state(gst.STATE_NULL) def seek(self, where): """ Jump to the given location """ self.__getPlayer().seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, where) def getPosition(self): """ Return the current position """ try: return self.__getPlayer().query_position(gst.FORMAT_TIME)[0] except: return 0 def getDuration(self): """ Return the duration of the current stream """ try: return self.__getPlayer().query_duration(gst.FORMAT_TIME)[0] except: return 0 ./decibel-audio-player-1.06/src/media/track/0000755000175000017500000000000011456551413020736 5ustar ingelresingelres./decibel-audio-player-1.06/src/media/track/__init__.py0000644000175000017500000003477311456551413023065 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os.path, tools from tools import consts, sec2str from gettext import gettext as _ # Tags asscociated to a track # The order should not be changed for compatibility reasons ( TAG_RES, # Full path to the resource TAG_SCH, # URI scheme (e.g., file, cdda) TAG_NUM, # Track number TAG_TIT, # Title TAG_ART, # Artist TAG_ALB, # Album TAG_LEN, # Length in seconds TAG_AAR, # Album artist TAG_DNB, # Disc number TAG_GEN, # Genre TAG_DAT, # Year TAG_MBT, # MusicBrainz track id TAG_PLP, # Position in the playlist TAG_PLL, # Length of the playlist TAG_BTR, # Bit rate TAG_MOD, # Constant or variable bit rate TAG_SMP, # Sample rate ) = range(17) # Special fields that may be used to call format() FIELDS = ( ( 'track' , _('Track number') ), ( 'title' , '\t' + _('Title') ), ( 'artist' , _('Artist') ), ( 'album' , _('Album') ), ( 'genre' , _('Genre') ), ( 'date' , _('Date') ), ( 'disc' , _('Disc number') ), ( 'bitrate' , _('Bit rate') ), ( 'sample_rate' , _('Sample rate') ), ( 'duration_sec', _('Duration in seconds (e.g., 194)') ), ( 'duration_str', _('Duration as a string (e.g., 3:14)') ), ( 'playlist_pos', _('Position of the track in the playlist') ), ( 'playlist_len', _('Number of tracks in the playlist') ), ( 'path' , _('Full path to the file') ), ) def getFormatSpecialFields(usePango=True): """ Return a string in plain English (or whatever language being used) giving the special fields that may be used to call Track.format() If usePango is True, the returned string uses Pango formatting for better presentation """ if usePango: return '\n'.join(['%s %s' % (field.ljust(14), desc) for (field, desc) in FIELDS]) else: return '\n'.join(['%s\t%s' % (field.ljust(14), desc) for (field, desc) in FIELDS]) class Track: """ A track and its associated tags """ def __init__(self, resource=None, scheme=None): """ Constructor """ self.tags = {} if scheme is not None: self.tags[TAG_SCH] = scheme if resource is not None: self.tags[TAG_RES] = resource def setNumber(self, nb): self.tags[TAG_NUM] = nb def setTitle(self, title): self.tags[TAG_TIT] = title def setArtist(self, artist): self.tags[TAG_ART] = artist def setAlbum(self, album): self.tags[TAG_ALB] = album def setLength(self, length): self.tags[TAG_LEN] = length def setAlbumArtist(self, albumArtist): self.tags[TAG_AAR] = albumArtist def setDiscNumber(self, discNumber): self.tags[TAG_DNB] = discNumber def setGenre(self, genre): self.tags[TAG_GEN] = genre def setDate(self, date): self.tags[TAG_DAT] = date def setMBTrackId(self, id): self.tags[TAG_MBT] = id def setPlaylistPos(self, pos): self.tags[TAG_PLP] = pos def setPlaylistLen(self, len): self.tags[TAG_PLL] = len def setBitrate(self, bitrate): self.tags[TAG_BTR] = bitrate def setSampleRate(self, sampleRate): self.tags[TAG_SMP] = sampleRate def setVariableBitrate(self): self.tags[TAG_MOD] = 1 def hasNumber(self): return TAG_NUM in self.tags def hasTitle(self): return TAG_TIT in self.tags def hasArtist(self): return TAG_ART in self.tags def hasAlbum(self): return TAG_ALB in self.tags def hasLength(self): return TAG_LEN in self.tags def hasAlbumArtist(self): return TAG_AAR in self.tags def hasDiscNumber(self): return TAG_DNB in self.tags def hasGenre(self): return TAG_GEN in self.tags def hasDate(self): return TAG_DAT in self.tags def hasMBTrackId(self): return TAG_MBT in self.tags def hasPlaylistPos(self): return TAG_PLP in self.tags def hasPlaylistLen(self): return TAG_PLL in self.tags def hasBitrate(self): return TAG_BTR in self.tags def hasSampleRate(self): return TAG_SMP in self.tags def __get(self, tag, defaultValue): """ Return the value of tag if it exists, or return defaultValue """ try: return self.tags[tag] except: return defaultValue def getFilePath(self): return self.tags[TAG_RES] def getNumber(self): return self.__get(TAG_NUM, consts.UNKNOWN_TRACK_NUMBER) def getTitle(self): return self.__get(TAG_TIT, consts.UNKNOWN_TITLE) def getArtist(self): return self.__get(TAG_ART, consts.UNKNOWN_ARTIST) def getAlbum(self): return self.__get(TAG_ALB, consts.UNKNOWN_ALBUM) def getLength(self): return self.__get(TAG_LEN, consts.UNKNOWN_LENGTH) def getAlbumArtist(self): return self.__get(TAG_AAR, consts.UNKNOWN_ALBUM_ARTIST) def getDiscNumber(self): return self.__get(TAG_DNB, consts.UNKNOWN_DISC_NUMBER) def getGenre(self): return self.__get(TAG_GEN, consts.UNKNOWN_GENRE) def getDate(self): return self.__get(TAG_DAT, consts.UNKNOWN_DATE) def getEncMode(self): return self.__get(TAG_MOD, consts.UNKNOWN_ENC_MODE) def getMBTrackId(self): return self.__get(TAG_MBT, consts.UNKNOWN_MB_TRACKID) def getPlaylistPos(self): return self.__get(TAG_PLP, -1) def getPlaylistLen(self): return self.__get(TAG_PLL, -1) def getBitrate(self): """ Transform the bit rate into a string """ bitrate = self.__get(TAG_BTR, consts.UNKNOWN_BITRATE) if bitrate == -1: return _('N/A') elif self.getEncMode() == 1: return '~ %u kbps' % (bitrate / 1000) else: return '%u kbps' % (bitrate / 1000) def getSampleRate(self): """ Transform the sample rate into a string""" return '%.1f kHz' % (self.__get(TAG_SMP, consts.UNKNOWN_SAMPLE_RATE) / 1000.0) def getSafeNumber(self): return str(self.__get(TAG_NUM, '')) def getSafeTitle(self): return self.__get(TAG_TIT, '') def getSafeArtist(self): return self.__get(TAG_ART, '') def getSafeAlbum(self): return self.__get(TAG_ALB, '') def getSafeLength(self): return str(self.__get(TAG_LEN, '')) def getSafeMBTrackId(self): return self.__get(TAG_MBT, '') def getURI(self): """ Return the complete URI to the resource """ try: return self.tags[TAG_SCH] + '://' + self.tags[TAG_RES] except: raise RuntimeError, 'The track is an unknown type of resource' def getExtendedAlbum(self): """ Return the album name plus the disc number, if any """ if self.getDiscNumber() != consts.UNKNOWN_DISC_NUMBER: return _('%(album)s [Disc %(discnum)u]') % {'album': self.getAlbum(), 'discnum': self.getDiscNumber()} else: return self.getAlbum() def getType(self): """ Return the format of the track """ if self.tags[TAG_SCH] == 'cdda': return _('CDDA Track') else: return os.path.splitext(self.tags[TAG_RES])[1][1:].lower() def __str__(self): """ String representation """ return '%s - %s - %s (%u)' % (self.getArtist(), self.getAlbum(), self.getTitle(), self.getNumber()) def __cmp__(self, track): """ Compare two tracks""" # Artist if self.hasAlbumArtist(): selfArtist = self.getAlbumArtist() else: selfArtist = self.getArtist() if track.hasAlbumArtist(): otherArtist = track.getAlbumArtist() else: otherArtist = track.getArtist() result = cmp(selfArtist.lower(), otherArtist.lower()) if result != 0: return result # Album result = cmp(self.getAlbum().lower(), track.getAlbum().lower()) if result != 0: return result # Disc number result = self.getDiscNumber() - track.getDiscNumber() if result != 0: return result # Track number result = self.getNumber() - track.getNumber() if result != 0: return result # Finally, file names return cmp(self.getFilePath(), track.getFilePath()) def format(self, fmtString): """ Replace the special fields in the given string by their corresponding value """ result = fmtString result = result.replace( '{path}', self.getFilePath() ) result = result.replace( '{album}', self.getAlbum() ) result = result.replace( '{track}', str(self.getNumber()) ) result = result.replace( '{title}', self.getTitle() ) result = result.replace( '{artist}', self.getArtist() ) result = result.replace( '{genre}', self.getGenre() ) result = result.replace( '{date}', str(self.getDate()) ) result = result.replace( '{disc}', str(self.getDiscNumber()) ) result = result.replace( '{bitrate}', self.getBitrate() ) result = result.replace( '{sample_rate}', str(self.getSampleRate()) ) result = result.replace( '{duration_sec}', str(self.getLength()) ) result = result.replace( '{duration_str}', sec2str(self.getLength()) ) result = result.replace( '{playlist_pos}', str(self.getPlaylistPos()) ) result = result.replace( '{playlist_len}', str(self.getPlaylistLen()) ) return result def formatHTMLSafe(self, fmtString): """ Replace the special fields in the given string by their corresponding value Also ensure that the fields don't contain HTML special characters (&, <, >) """ result = fmtString result = result.replace( '{path}', tools.htmlEscape(self.getFilePath()) ) result = result.replace( '{album}', tools.htmlEscape(self.getAlbum()) ) result = result.replace( '{track}', str(self.getNumber()) ) result = result.replace( '{title}', tools.htmlEscape(self.getTitle()) ) result = result.replace( '{artist}', tools.htmlEscape(self.getArtist()) ) result = result.replace( '{genre}', tools.htmlEscape(self.getGenre()) ) result = result.replace( '{date}', str(self.getDate()) ) result = result.replace( '{disc}', str(self.getDiscNumber()) ) result = result.replace( '{bitrate}', self.getBitrate() ) result = result.replace( '{sample_rate}', self.getSampleRate() ) result = result.replace( '{duration_sec}', str(self.getLength()) ) result = result.replace( '{duration_str}', sec2str(self.getLength()) ) result = result.replace( '{playlist_pos}', str(self.getPlaylistPos()) ) result = result.replace( '{playlist_len}', str(self.getPlaylistLen()) ) return result def __addIfKnown(self, dic, key, tag, unknownValue): """ This is an helper function used by the getMPRISMetadata() function """ value = self.__get(tag, unknownValue) if value != unknownValue: dic[key] = value def getMPRISMetadata(self): """ Return a dictionary with all available data in an MPRIS-compatible format """ data = {'location': self.getURI()} self.__addIfKnown(data, 'tracknumber', TAG_NUM, consts.UNKNOWN_TRACK_NUMBER) self.__addIfKnown(data, 'title', TAG_TIT, consts.UNKNOWN_TITLE) self.__addIfKnown(data, 'time', TAG_LEN, consts.UNKNOWN_LENGTH) self.__addIfKnown(data, 'artist', TAG_ART, consts.UNKNOWN_ARTIST) self.__addIfKnown(data, 'album', TAG_ALB, consts.UNKNOWN_ALBUM) self.__addIfKnown(data, 'mb track id', TAG_MBT, consts.UNKNOWN_MB_TRACKID) self.__addIfKnown(data, 'genre', TAG_GEN, consts.UNKNOWN_GENRE) self.__addIfKnown(data, 'date', TAG_DAT, consts.UNKNOWN_DATE) self.__addIfKnown(data, 'audio-bitrate', TAG_BTR, -1) self.__addIfKnown(data, 'audio-samplerate', TAG_SMP, consts.UNKNOWN_SAMPLE_RATE) # 'mtime' must be in milliseconds if 'time' in data: data['mtime'] = data['time'] * 1000 return data def getTags(self): """ Return the disctionary of tags """ return self.tags def setTags(self, tags): """ Set the disctionary of tags """ self.tags = tags def serialize(self): """ Serialize this Track object, return the corresponding string """ tags = [] for tag, value in self.tags.iteritems(): tags.append(str(tag)) tags.append((str(value)).replace(' ', '\x00')) return ' '.join(tags) def unserialize(self, serialTrack): """ Unserialize the given track""" tags = serialTrack.split(' ') for i in xrange(0, len(tags), 2): tag = int(tags[i]) if tag in (TAG_NUM, TAG_LEN, TAG_DNB, TAG_DAT, TAG_PLP, TAG_PLL, TAG_BTR, TAG_SMP, TAG_MOD): self.tags[tag] = int(tags[i+1]) else: self.tags[tag] = tags[i+1].replace('\x00', ' ') def unserialize(serialTrack): """ Return the Track object corresponding to the given serialized version """ t = Track() t.unserialize(serialTrack) return t ./decibel-audio-player-1.06/src/media/track/cdTrack.py0000644000175000017500000000177411456551413022674 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.track import Track class CDTrack(Track): """ A Track that has been created from an audio CD """ def __init__(self, resource): """ Constructor """ Track.__init__(self, resource, 'cdda') ./decibel-audio-player-1.06/src/media/track/fileTrack.py0000644000175000017500000000177111456551413023222 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.track import Track class FileTrack(Track): """ A Track that has been created from a file """ def __init__(self, resource): """ Constructor """ Track.__init__(self, resource, 'file') ./decibel-audio-player-1.06/src/media/format/0000755000175000017500000000000011456551413021122 5ustar ingelresingelres./decibel-audio-player-1.06/src/media/format/__init__.py0000644000175000017500000000452511456551413023241 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA def createFileTrack(file, bitrate, length, samplerate, isVBR, title=None, album=None, artist=None, albumArtist=None, musicbrainzId=None, genre=None, trackNumber=None, date=None, discNumber=None): """ Create a new FileTrack object based on the given information """ from media.track.fileTrack import FileTrack track = FileTrack(file) track.setLength(length) track.setBitrate(bitrate) track.setSampleRate(samplerate) if isVBR: track.setVariableBitrate() if title is not None: track.setTitle(title) if album is not None: track.setAlbum(album) if artist is not None: track.setArtist(artist) if albumArtist is not None: track.setAlbumArtist(albumArtist) if musicbrainzId is not None: track.setMBTrackId(musicbrainzId) if genre is not None: track.setGenre(genre) if date is not None: try: track.setDate(int(date)) except: pass # The format of the track number may be 'X' or 'X/Y' # We discard Y since we don't use this information if trackNumber is not None: try: track.setNumber(int(trackNumber.split('/')[0])) except: pass # The format of the disc number may be 'X' or 'X/Y' # We discard the disc number when Y is less than 2 if discNumber is not None: try: discNumber = discNumber.split('/') if len(discNumber) == 1 or int(discNumber[1]) > 1: track.setDiscNumber(int(discNumber[0])) except: pass return track ./decibel-audio-player-1.06/src/media/format/wavpack.py0000644000175000017500000000347311456551413023137 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from a WavPack file """ from mutagen.wavpack import WavPack wvFile = WavPack(filename) length = int(round(wvFile.info.length)) samplerate = int(wvFile.info.sample_rate) try: title = str(wvFile['Title'][0]) except: title = None try: album = str(wvFile['Album'][0]) except: album = None try: artist = str(wvFile['Artist'][0]) except: artist = None try: albumArtist = str(wvFile['Album Artist'][0]) except: albumArtist = None try: genre = str(wvFile['genre'][0]) except: genre = None try: trackNumber = str(wvFile['Track'][0]) except: trackNumber = None try: discNumber = str(wvFile['Disc'][0]) except: discNumber = None try: date = str(wvFile['Year'][0]) except: date = None return createFileTrack(filename, -1, length, samplerate, False, title, album, artist, albumArtist, None, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/mp3.py0000644000175000017500000000420411456551413022173 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an mp3 file """ from mutagen.mp3 import MP3 from mutagen.id3 import ID3 mp3File = MP3(filename) length = int(round(mp3File.info.length)) bitrate = int(mp3File.info.bitrate) samplerate = int(mp3File.info.sample_rate) if mp3File.info.mode == 1: isVBR = True else: isVBR = False try: id3 = ID3(filename) except: return createFileTrack(filename, bitrate, length, samplerate, isVBR) try: title = str(id3['TIT2']) except: title = None try: album = str(id3['TALB']) except: album = None try: artist = str(id3['TPE1']) except: artist = None try: albumArtist = str(id3['TPE2']) except: albumArtist = None try: musicbrainzId = id3['UFID:http://musicbrainz.org'].data except: musicbrainzId = None try: genre = str(id3['TCON']) except: genre = None try: trackNumber = str(id3['TRCK']) except: trackNumber = None try: date = str(id3['TDRC'][0].year) except: date = None try: discNumber = str(id3['TPOS']) except: discNumber = None return createFileTrack(filename, bitrate, length, samplerate, isVBR, title, album, artist, albumArtist, musicbrainzId, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/asf.py0000644000175000017500000000376711456551413022262 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an asf file """ from mutagen.asf import ASF asfFile = ASF(filename) length = int(round(asfFile.info.length)) bitrate = int(asfFile.info.bitrate) samplerate = int(asfFile.info.sample_rate) try: trackNumber = str(asfFile['WM/TrackNumber'][0]) except: trackNumber = None try: discNumber = str(asfFile['WM/PartOfSet'][0]) except: discNumber = None try: date = str(asfFile['WM/Year'][0]) except: date = None try: title = str(asfFile['Title'][0]) except: title = None try: album = str(asfFile['WM/AlbumTitle'][0]) except: album = None try: artist = str(asfFile['Author'][0]) except: artist = None try: albumArtist = str(asfFile['WM/AlbumArtist'][0]) except: albumArtist = None try: genre = str(asfFile['WM/Genre'][0]) except: genre = None try: musicbrainzId = str(asfFile['MusicBrainz/Track Id'][0]) except: musicbrainzId = None return createFileTrack(filename, bitrate, length, samplerate, False, title, album, artist, albumArtist, musicbrainzId, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/ogg.py0000644000175000017500000000377011456551413022257 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an Ogg Vorbis file """ from mutagen.oggvorbis import OggVorbis oggFile = OggVorbis(filename) length = int(round(oggFile.info.length)) bitrate = int(oggFile.info.bitrate) samplerate = int(oggFile.info.sample_rate) try: title = str(oggFile['title'][0]) except: title = None try: album = str(oggFile['album'][0]) except: album = None try: artist = str(oggFile['artist'][0]) except: artist = None try: albumArtist = str(oggFile['albumartist'][0]) except: albumArtist = None try: genre = str(oggFile['genre'][0]) except: genre = None try: musicbrainzId = str(oggFile['musicbrainz_trackid'][0]) except: musicbrainzId = None try: trackNumber = str(oggFile['tracknumber'][0]) except: trackNumber = None try: discNumber = str(oggFile['discnumber'][0]) except: discNumber = None try: date = str(oggFile['date'][0]) except: date = None return createFileTrack(filename, bitrate, length, samplerate, True, title, album, artist, albumArtist, musicbrainzId, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/mp4.py0000644000175000017500000000356111456551413022201 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an mp4 file """ from mutagen.mp4 import MP4 mp4File = MP4(filename) length = int(round(mp4File.info.length)) bitrate = int(mp4File.info.bitrate) samplerate = int(mp4File.info.sample_rate) try: trackNumber = str(mp4File['trkn'][0][0]) except: trackNumber = None try: discNumber = str(mp4File['disk'][0][0]) except: discNumber = None try: date = str(mp4File['\xa9day'][0][0]) except: date = None try: title = str(mp4File['\xa9nam'][0]) except: title = None try: album = str(mp4File['\xa9alb'][0]) except: album = None try: artist = str(mp4File['\xa9ART'][0]) except: artist = None try: genre = str(mp4File['\xa9gen'][0]) except: genre = None try: albumArtist = str(mp4File['aART'][0]) except: albumArtist = None return createFileTrack(filename, bitrate, length, samplerate, False, title, album, artist, albumArtist, None, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/monkeysaudio.py0000644000175000017500000000321111456551413024200 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an APE file """ from mutagen.monkeysaudio import MonkeysAudio mFile = MonkeysAudio(filename) length = int(round(mFile.info.length)) samplerate = int(mFile.info.sample_rate) try: trackNumber = str(mFile['Track'][0]) except: trackNumber = None try: date = str(mFile['Year'][0]) except: date = None try: title = str(mFile['Title'][0]) except: title = None try: album = str(mFile['Album'][0]) except: album = None try: artist = str(mFile['Artist'][0]) except: artist = None try: genre = str(mFile['Genre'][0]) except: genre = None return createFileTrack(filename, -1, length, samplerate, False, title, album, artist, None, None, genre, trackNumber, date, None) ./decibel-audio-player-1.06/src/media/format/mpc.py0000644000175000017500000000372611456551413022263 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from an mpc file """ from mutagen.musepack import Musepack mpcFile = Musepack(filename) length = int(round(mpcFile.info.length)) bitrate = int(mpcFile.info.bitrate * 1000) samplerate = int(mpcFile.info.sample_rate) try: trackNumber = str(mpcFile['Track']) except: trackNumber = None try: discNumber = str(mpcFile['Discnumber']) except: discNumber = None try: date = str(mpcFile['Year']) except: date = None try: title = str(mpcFile['Title']) except: title = None try: genre = str(mpcFile['Genre']) except: genre = None try: musicbrainzId = str(mpcFile['MUSICBRAINZ_TRACKID']) except: musicbrainzId = None try: album = str(mpcFile['Album']) except: album = None try: artist = str(mpcFile['Artist']) except: artist = None try: albumArtist = str(mpcFile['Album Artist']) except: albumArtist = None return createFileTrack(filename, bitrate, length, samplerate, False, title, album, artist, albumArtist, musicbrainzId, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/media/format/flac.py0000644000175000017500000000367711456551413022416 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from media.format import createFileTrack def getTrack(filename): """ Return a Track created from a FLAC file """ from mutagen.flac import FLAC flacFile = FLAC(filename) length = int(round(flacFile.info.length)) samplerate = int(flacFile.info.sample_rate) try: title = str(flacFile['title'][0]) except: title = None try: album = str(flacFile['album'][0]) except: album = None try: artist = str(flacFile['artist'][0]) except: artist = None try: albumArtist = str(flacFile['albumartist'][0]) except: albumArtist = None try: genre = str(flacFile['genre'][0]) except: genre = None try: musicbrainzId = str(flacFile['musicbrainz_trackid'][0]) except: musicbrainzId = None try: trackNumber = str(flacFile['tracknumber'][0]) except: trackNumber = None try: discNumber = str(flacFile['discnumber'][0]) except: discNumber = None try: date = str(flacFile['date'][0]) except: date = None return createFileTrack(filename, -1, length, samplerate, False, title, album, artist, albumArtist, musicbrainzId, genre, trackNumber, date, discNumber) ./decibel-audio-player-1.06/src/gui/0000755000175000017500000000000011456551413017337 5ustar ingelresingelres./decibel-audio-player-1.06/src/gui/extListview.py0000644000175000017500000006315711456551413022254 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # ExtListView v1.8 # # v1.8: # * Added an __iter__ method # * Don't detach the model while inserting rows to avoid unwanted scrolling # # v1.7: # * The 'extlistview-modified' signal was not generated when calling clear() and replaceContent() # * Added selectRows(), removeRow(), and removeRows() method # * Really fixed the intermittent improper columns resizing # * Added the 'extlistview-selection-changed' signal # # v1.6: # * Added a context menu to column headers allowing users to show/hide columns # * Improved sorting a bit # # v1.5: # * Fixed intermittent improper columns resizing # # v1.4: # * Replaced TYPE_INT by TYPE_PYOBJECT as the fifth parameter type of extListview-dnd # (see http://www.daa.com.au/pipermail/pygtk/2007-October/014311.html) # * Prevent sorting rows when the list is empty # # v1.3: # * Greatly improved speed when sorting a lot of rows # * Added support for gtk.CellRendererToggle # * Improved replaceContent() method # * Added a call to set_cursor() when removing selected row(s) # * Added getFirstSelectedRow(), appendRows(), addColumnAttribute(), unselectAll() and selectAll() methods # * Set expand to False when calling pack_start() # # v1.2: # * Fixed D'n'D reordering bugs # * Improved code for testing the state of the keys for mouse clicks # * Added quite a few new methods (replaceContent, hasMarkAbove, hasMarkUnder, __len__, iterSelectedRows, iterAllRows) # # v1.1: # * Added a call to set_cursor() when unselecting all rows upon clicking on the empty area # * Sort indicators are now displayed whenever needed import gtk, random from gtk import gdk from gobject import signal_new, TYPE_INT, TYPE_STRING, TYPE_BOOLEAN, TYPE_PYOBJECT, TYPE_NONE, SIGNAL_RUN_LAST # Internal d'n'd (reordering) DND_REORDERING_ID = 1024 DND_INTERNAL_TARGET = ('extListview-internal', gtk.TARGET_SAME_WIDGET, DND_REORDERING_ID) # Custom signals signal_new('extlistview-dnd', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (gdk.DragContext, TYPE_INT, TYPE_INT, gtk.SelectionData, TYPE_INT, TYPE_PYOBJECT)) signal_new('extlistview-modified', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, ()) signal_new('extlistview-button-pressed', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (gdk.Event, TYPE_PYOBJECT)) signal_new('extlistview-column-visibility-changed', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (TYPE_STRING, TYPE_BOOLEAN)) signal_new('button-press-event', gtk.TreeViewColumn, SIGNAL_RUN_LAST, TYPE_NONE, (gdk.Event, )) signal_new('extlistview-selection-changed', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (TYPE_PYOBJECT, )) class ExtListViewColumn(gtk.TreeViewColumn): """ TreeViewColumn does not signal right-click events, and we need them This subclass is equivalent to TreeViewColumn, but it signals these events Most of the code in this class comes from Quod Libet (http://www.sacredchao.net/quodlibet) """ def __init__(self, title=None, cell_renderer=None, **args): """ Constructor, see gtk.TreeViewColumn """ gtk.TreeViewColumn.__init__(self, title, cell_renderer, **args) label = gtk.Label(title) self.set_widget(label) label.show() label.__realize = label.connect('realize', self.onRealize) def onRealize(self, widget): widget.disconnect(widget.__realize) del widget.__realize button = widget.get_ancestor(gtk.Button) if button is not None: button.connect('button-press-event', self.onButtonPressed) def onButtonPressed(self, widget, event): self.emit('button-press-event', event) class ExtListView(gtk.TreeView): def __init__(self, columns, sortable=True, dndTargets=[], useMarkup=False, canShowHideColumns=True): """ If sortable is True, the user can click on headers to sort the contents of the list The d'n'd targets are the targets accepted by the list (e.g., [('text/uri-list', 0, 0)]) Note that for the latter, the identifier 1024 must not be used (internally used for reordering) If useMarkup is True, the 'markup' attributes is used instead of 'text' for CellRendererTexts """ gtk.TreeView.__init__(self) self.selection = self.get_selection() # Sorting rows self.sortLastCol = None # The last column used for sorting (needed to switch between ascending/descending) self.sortAscending = True # Ascending or descending order self.sortColCriteria = {} # For each column, store the tuple of indexes used to sort the rows # Default configuration for this list self.set_rules_hint(True) self.set_headers_visible(True) self.selection.set_mode(gtk.SELECTION_MULTIPLE) # Create the columns nbEntries = 0 dataTypes = [] for (title, renderers, sortIndexes, expandable, visible) in columns: if title is None: nbEntries += len(renderers) dataTypes += [renderer[1] for renderer in renderers] else: column = ExtListViewColumn(title) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) column.set_expand(expandable) column.set_visible(visible) if canShowHideColumns: column.connect('button-press-event', self.onColumnHeaderClicked) self.append_column(column) if sortable: column.set_clickable(True) column.connect('clicked', self.__sortRows) self.sortColCriteria[column] = sortIndexes for (renderer, type) in renderers: nbEntries += 1 dataTypes.append(type) column.pack_start(renderer, False) if isinstance(renderer, gtk.CellRendererToggle): column.add_attribute(renderer, 'active', nbEntries-1) elif isinstance(renderer, gtk.CellRendererPixbuf): column.add_attribute(renderer, 'pixbuf', nbEntries-1) elif isinstance(renderer, gtk.CellRendererText): if useMarkup: column.add_attribute(renderer, 'markup', nbEntries-1) else: column.add_attribute(renderer, 'text', nbEntries-1) # Mark management self.markedRow = None self.markColumn = len(dataTypes) dataTypes.append(TYPE_BOOLEAN) # When there's no other solution, this additional entry helps in finding the marked row # Create the ListStore associated with this tree self.store = gtk.ListStore(*dataTypes) self.set_model(self.store) # Drag'n'drop management self.dndContext = None self.dndTargets = dndTargets self.motionEvtId = None self.dndStartPos = None self.dndReordering = False if len(dndTargets) != 0: self.enable_model_drag_dest(dndTargets, gdk.ACTION_DEFAULT) # TreeView events self.connect('drag-begin', self.onDragBegin) self.connect('drag-motion', self.onDragMotion) self.connect('button-press-event', self.onButtonPressed) self.connect('drag-data-received', self.onDragDataReceived) self.connect('button-release-event', self.onButtonReleased) # Selection events self.selection.connect('changed', self.onSelectionChanged) # Show the list self.show() # --== Miscellaneous ==-- def __getIterOnSelectedRows(self): """ Return a list of iterators pointing to the selected rows """ return [self.store.get_iter(path) for path in self.selection.get_selected_rows()[1]] def __resizeColumns(self): """ That's the only way I could find to make sure columns are correctly resized (e.g., columns_autosize() has no effect) """ for column in self.get_columns(): column.queue_resize() def addColumnAttribute(self, colIndex, renderer, attribute, value): """ Add a new attribute to the given column """ self.get_column(colIndex).add_attribute(renderer, attribute, value) # --== Mark management ==-- def hasMark(self): """ True if a mark has been set """ return self.markedRow is not None def hasMarkAbove(self, index): """ True if a mark is set and is above the given index """ return self.markedRow is not None and self.markedRow > index def hasMarkUnder(self, index): """ True if a mark is set and is undex the given index """ return self.markedRow is not None and self.markedRow < index def clearMark(self): """ Remove the mark """ if self.markedRow is not None: self.setItem(self.markedRow, self.markColumn, False) self.markedRow = None def getMark(self): """ Return the index of the marked row """ return self.markedRow def setMark(self, rowIndex): """ Put the mark on the given row, it will move with the row itself (e.g., D'n'D) """ self.clearMark() self.markedRow = rowIndex self.setItem(rowIndex, self.markColumn, True) def __findMark(self): """ Linear search for the marked row -- To be used only when there's no other solution """ iter = self.store.get_iter_first() while iter is not None: if self.store.get_value(iter, self.markColumn) == True: self.markedRow = self.store.get_path(iter)[0] break iter = self.store.iter_next(iter) # --== Sorting content ==-- def __resetSorting(self): """ Reset sorting such that the next column click will result in an ascending sorting """ if self.sortLastCol is not None: self.sortLastCol.set_sort_indicator(False) self.sortLastCol = None def __cmpRows(self, row1, row2, criteria, ascending): """ Compare two rows based on the given criteria, the latter being a tuple of the indexes to use for the comparison """ # Sorting on the first criterion may be done either ascending or descending criterion = criteria[0] result = cmp(row1[criterion], row2[criterion]) if result != 0: if ascending: return result else: return -result # For subsequent criteria, the order is always ascending for criterion in criteria[1:]: result = cmp(row1[criterion], row2[criterion]) if result != 0: return result return 0 def __sortRows(self, column): """ Sort the rows """ if len(self.store) == 0: return if self.sortLastCol is not None: self.sortLastCol.set_sort_indicator(False) # Find how sorting must be done if self.sortLastCol == column: self.sortAscending = not self.sortAscending else: self.sortLastCol = column self.sortAscending = True # Dump the rows, sort them, and reorder the list rows = [tuple(r) + (i,) for i, r in enumerate(self.store)] criteria = self.sortColCriteria[column] rows.sort(lambda r1, r2: self.__cmpRows(r1, r2, criteria, self.sortAscending)) self.store.reorder([r[-1] for r in rows]) # Move the mark if needed if self.markedRow is not None: self.__findMark() column.set_sort_indicator(True) if self.sortAscending: column.set_sort_order(gtk.SORT_ASCENDING) else: column.set_sort_order(gtk.SORT_DESCENDING) self.emit('extlistview-modified') # --== Selection ==-- def unselectAll(self): """ Unselect all rows """ self.selection.unselect_all() def selectAll(self): """ Select all rows """ self.selection.select_all() def selectRows(self, paths): """ Select the given rows """ self.unselectAll() for path in paths: self.selection.select_path(path) def getSelectedRowsCount(self): """ Return how many rows are currently selected """ return self.selection.count_selected_rows() def getSelectedRows(self): """ Return all selected row(s) """ return [tuple(self.store[path])[:-1] for path in self.selection.get_selected_rows()[1]] def getFirstSelectedRow(self): """ Return only the first selected row """ return tuple(self.store[self.selection.get_selected_rows()[1][0]])[:-1] def getFirstSelectedRowIndex(self): """ Return the index of the first selected row """ return self.selection.get_selected_rows()[1][0][0] def iterSelectedRows(self): """ Iterate on all selected row(s) """ for path in self.selection.get_selected_rows()[1]: yield tuple(self.store[path])[:-1] # --== Retrieving content / Iterating on content ==-- def __len__(self): """ Return how many rows are stored in the list """ return len(self.store) def getCount(self): """ Return how many rows are stored in the list """ return len(self.store) def __iter__(self): """ Iterate on all rows """ for row in self.store: yield tuple(row)[:-1] def iterAllRows(self): """ Iterate on all rows """ for row in self.store: yield tuple(row)[:-1] def getRow(self, rowIndex): """ Return the given row """ return tuple(self.store[rowIndex])[:-1] def getAllRows(self): """ Return all rows """ return [tuple(row)[:-1] for row in self.store] def getItem(self, rowIndex, colIndex): """ Return the value of the given item """ return self.store.get_value(self.store.get_iter(rowIndex), colIndex) # --== Adding/removing/modifying content ==-- def clear(self): """ Remove all rows from the list """ self.__resetSorting() self.clearMark() self.store.clear() self.__resizeColumns() self.emit('extlistview-modified') def setItem(self, rowIndex, colIndex, value): """ Change the value of the given item """ # Check if changing that item may change the sorting: if so, reset sorting if self.sortLastCol is not None and colIndex in self.sortColCriteria[self.sortLastCol]: self.__resetSorting() self.store.set_value(self.store.get_iter(rowIndex), colIndex, value) def removeRows(self, paths): """ Remove the given rows """ self.freeze_child_notify() # We must work with iters because paths become meaningless once we start removing rows for iter in [self.store.get_iter(path) for path in paths]: path = self.store.get_path(iter)[0] # Move the mark if needed if self.markedRow is not None: if path < self.markedRow: self.markedRow -= 1 elif path == self.markedRow: self.markedRow = None # Remove the current row if self.store.remove(self.store.get_iter(path)): self.set_cursor(path) elif len(self.store) != 0: self.set_cursor(len(self.store)-1) self.thaw_child_notify() if len(self.store) == 0: self.set_cursor(0) self.__resetSorting() self.__resizeColumns() self.emit('extlistview-modified') def removeRow(self, path): """ Remove the given row """ self.removeRows((path, )) def removeSelectedRows(self): """ Remove the selected row(s) """ self.removeRows(self.selection.get_selected_rows()[1]) def cropSelectedRows(self): """ Remove all rows but the selected ones """ pathsList = self.selection.get_selected_rows()[1] self.freeze_child_notify() self.selection.select_all() for path in pathsList: self.selection.unselect_path(path) self.removeSelectedRows() self.selection.select_all() self.thaw_child_notify() def insertRows(self, rows, position=None): """ Insert or append (if position is None) some rows to the list """ if len(rows) == 0: return # Insert the additional column used for the mark management if type(rows[0]) is tuple: rows[:] = [row + (False,) for row in rows] else: rows[:] = [row + [False] for row in rows] # Move the mark if needed if self.markedRow is not None and position is not None and position <= self.markedRow: self.markedRow += len(rows) # Insert rows self.freeze_child_notify() if position is None: for row in rows: self.store.append(row) else: for row in rows: self.store.insert(position, row) position += 1 self.thaw_child_notify() self.__resetSorting() self.emit('extlistview-modified') def appendRows(self, rows): """ Helper function, equivalent to insertRows(rows, None) """ self.insertRows(rows, None) def replaceContent(self, rows): """ Replace the content of the list with the given rows """ self.freeze_child_notify() self.set_model(None) self.clear() self.appendRows(rows) self.set_model(self.store) self.thaw_child_notify() def shuffle(self): """ Shuffle the content of the list """ order = range(len(self.store)) random.shuffle(order) self.store.reorder(order) # Move the mark if needed if self.markedRow is not None: self.__findMark() self.__resetSorting() self.emit('extlistview-modified') # --== D'n'D management ==-- def enableDNDReordering(self): """ Enable the use of Drag'n'Drop to reorder the list """ self.dndReordering = True self.dndTargets.append(DND_INTERNAL_TARGET) self.enable_model_drag_dest(self.dndTargets, gdk.ACTION_DEFAULT) def __isDropAfter(self, pos): """ Helper function, True if pos is gtk.TREE_VIEW_DROP_AFTER or gtk.TREE_VIEW_DROP_INTO_OR_AFTER """ return pos == gtk.TREE_VIEW_DROP_AFTER or pos == gtk.TREE_VIEW_DROP_INTO_OR_AFTER def __moveSelectedRows(self, x, y): """ Internal function used for drag'n'drop """ iterList = self.__getIterOnSelectedRows() dropInfo = self.get_dest_row_at_pos(int(x), int(y)) if dropInfo is None: pos, path = gtk.TREE_VIEW_DROP_INTO_OR_AFTER, len(self.store) - 1 else: pos, path = dropInfo[1], dropInfo[0][0] if self.__isDropAfter(pos) and path < len(self.store)-1: pos = gtk.TREE_VIEW_DROP_INTO_OR_BEFORE path += 1 self.freeze_child_notify() for srcIter in iterList: srcPath = self.store.get_path(srcIter)[0] if self.__isDropAfter(pos): dstIter = self.store.insert_after(self.store.get_iter(path), self.store[srcIter]) else: dstIter = self.store.insert_before(self.store.get_iter(path), self.store[srcIter]) if path == srcPath: path += 1 self.store.remove(srcIter) dstPath = self.store.get_path(dstIter)[0] if srcPath > dstPath: path += 1 if self.markedRow is not None: if srcPath == self.markedRow: self.markedRow = dstPath elif srcPath < self.markedRow and dstPath >= self.markedRow: self.markedRow -= 1 elif srcPath > self.markedRow and dstPath <= self.markedRow: self.markedRow += 1 self.thaw_child_notify() self.__resetSorting() self.emit('extlistview-modified') # --== GTK Handlers ==-- def onButtonPressed(self, tree, event): """ A mouse button has been pressed """ retVal = False pathInfo = self.get_path_at_pos(int(event.x), int(event.y)) if pathInfo is None: path = None else: path = pathInfo[0] if event.button == 1 or event.button == 3: if path is None: self.selection.unselect_all() if len(self.store) != 0: tree.set_cursor(len(self.store)) else: if self.dndReordering and self.motionEvtId is None and event.button == 1: self.dndStartPos = (int(event.x), int(event.y)) self.motionEvtId = gtk.TreeView.connect(self, 'motion-notify-event', self.onMouseMotion) stateClear = not (event.state & (gdk.SHIFT_MASK | gdk.CONTROL_MASK)) if stateClear and not self.selection.path_is_selected(path): # We block the 'changed' signal here because it's emitted by the default GTK handler # And we don't need to emit it multiple times because of what we're doing here self.selection.handler_block_by_func(self.onSelectionChanged) self.selection.unselect_all() self.selection.select_path(path) self.selection.handler_unblock_by_func(self.onSelectionChanged) else: retVal = (stateClear and self.getSelectedRowsCount() > 1 and self.selection.path_is_selected(path)) self.emit('extlistview-button-pressed', event, path) return retVal def onButtonReleased(self, tree, event): """ A mouse button has been released """ if self.motionEvtId is not None: self.disconnect(self.motionEvtId) self.dndContext = None self.motionEvtId = None if len(self.dndTargets) != 0: self.enable_model_drag_dest(self.dndTargets, gdk.ACTION_DEFAULT) stateClear = not (event.state & (gdk.SHIFT_MASK | gdk.CONTROL_MASK)) if stateClear and event.state & gdk.BUTTON1_MASK and self.getSelectedRowsCount() > 1: pathInfo = self.get_path_at_pos(int(event.x), int(event.y)) if pathInfo is not None: self.selection.unselect_all() self.selection.select_path(pathInfo[0][0]) def onMouseMotion(self, tree, event): """ The mouse has been moved """ if self.dndContext is None and self.drag_check_threshold(self.dndStartPos[0], self.dndStartPos[1], int(event.x), int(event.y)): self.dndContext = self.drag_begin([DND_INTERNAL_TARGET], gdk.ACTION_COPY, 1, event) def onDragBegin(self, tree, context): """ A drag'n'drop operation has begun """ if self.getSelectedRowsCount() == 1: context.set_icon_stock(gtk.STOCK_DND, 0, 0) else: context.set_icon_stock(gtk.STOCK_DND_MULTIPLE, 0, 0) def onDragDataReceived(self, tree, context, x, y, selection, dndId, time): """ Some data has been dropped into the list """ if dndId == DND_REORDERING_ID: self.__moveSelectedRows(x, y) else: self.emit('extlistview-dnd', context, int(x), int(y), selection, dndId, time) def onDragMotion(self, tree, context, x, y, time): """ Prevent rows from being dragged *into* other rows (this is a list, not a tree) """ drop = self.get_dest_row_at_pos(int(x), int(y)) if drop is not None and (drop[1] == gtk.TREE_VIEW_DROP_INTO_OR_AFTER or drop[1] == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE): self.enable_model_drag_dest([('invalid-position', 0, -1)], gdk.ACTION_DEFAULT) else: self.enable_model_drag_dest(self.dndTargets, gdk.ACTION_DEFAULT) def onColumnHeaderClicked(self, column, event): """ A column header has been clicked """ if event.button == 3: # Create a menu with a CheckMenuItem per column menu = gtk.Menu() nbVisibleItems = 0 lastVisibleItem = None for column in self.get_columns(): item = gtk.CheckMenuItem(column.get_title()) item.set_active(column.get_visible()) item.connect('toggled', self.onShowHideColumn, column) item.show() menu.append(item) # Count how many columns are visible if item.get_active(): nbVisibleItems += 1 lastVisibleItem = item # Don't allow the user to hide the only visible column left if nbVisibleItems == 1: lastVisibleItem.set_sensitive(False) menu.popup(None, None, None, event.button, event.get_time()) def onShowHideColumn(self, menuItem, column): """ Switch the visibility of the given column """ column.set_visible(not column.get_visible()) self.__resizeColumns() self.emit('extlistview-column-visibility-changed', column.get_title(), column.get_visible()) def onSelectionChanged(self, selection): """ The selection has changed """ self.emit('extlistview-selection-changed', self.getSelectedRows()) ./decibel-audio-player-1.06/src/gui/__init__.py0000644000175000017500000000312611456551413021452 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, tools def __msgBox(parent, type, buttons, header, text): """ Show a generic message box """ dlg = gtk.MessageDialog(parent, gtk.DIALOG_MODAL, type, buttons, header) dlg.set_title(tools.consts.appName) if text is None: dlg.set_markup(header) else: dlg.format_secondary_markup(text) response = dlg.run() dlg.destroy() return response # Functions used to display various message boxes def infoMsgBox( parent, header, text=None): __msgBox(parent, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, header, text) def errorMsgBox( parent, header, text=None): __msgBox(parent, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, header, text) def questionMsgBox(parent, header, text=None): return __msgBox(parent, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, header, text) ./decibel-audio-player-1.06/src/gui/authentication.py0000644000175000017500000001367411456551413022743 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, gui, tools from tools import consts, prefs from base64 import b64encode, b64decode from gettext import gettext as _ # The dialog used for authentication mBtnOk = None mAuthDlg = None mChkStore = None mTxtLogin = None mTxtPasswd = None __keyring = None def __loadKeyring(): """ Load the keyring if needed """ global __keyring import gnomekeyring as gk if __keyring is None: __keyring = gk.get_default_keyring_sync() if __keyring is None: __keyring = 'login' def __loadAuthInfo(id): """ Load the login/password associated with id, either from the Gnome keyring or from the prefs """ try: import gnomekeyring as gk useGK = True except: useGK = False # No Gnome keyring if not useGK: login = prefs.get(__name__, id + '_login', None) passwd = prefs.get(__name__, id + '_passwd', None) if login is not None and passwd is not None: return (login, b64decode(passwd)) else: return None # From here we can use the Gnome keyring __loadKeyring() try: gk.create_sync(__keyring, None) except gk.AlreadyExistsError: pass token = prefs.get(__name__, id + '_gkToken', None) if token is not None: try: login, passwd = gk.item_get_info_sync(__keyring, token).get_secret().split('\n') return (login, passwd) except: pass return None def __storeAuthInfo(id, login, passwd): """ Store the login/password associated with id, either in the Gnome keyring or in the prefs """ try: import gnomekeyring as gk useGK = True except: useGK = False # No Gnome keyring if not useGK: prefs.set(__name__, id + '_login', login) prefs.set(__name__, id + '_passwd', b64encode(passwd)) # Pretty useless, but the user prefers not to see his password as clear text return # From here we can use the Gnome keyring __loadKeyring() try: label = '%s (%s)' % (consts.appName, id) authInfo = '\n'.join((login, passwd)) token = gk.item_create_sync(__keyring, gk.ITEM_GENERIC_SECRET, label, {'appName': consts.appName, 'id': id}, authInfo, True) prefs.set(__name__, id + '_gkToken', token) except: pass def getAuthInfo(id, reason, defaultLogin=None, force=False, parent=None): """ The parameter id may be any arbitrary string, but it must be unique as it identifies the login information given by the user. If a {login/password} is already known for this identifier, it is immediately returned without asking anything to the user. If no login is currently known, ask the user for the authentication information. """ global mBtnOk, mAuthDlg, mChkStore, mTxtLogin, mTxtPasswd if not force: authInfo = __loadAuthInfo(id) if authInfo is not None: return authInfo if mAuthDlg is None: wTree = tools.loadGladeFile('Authentication.glade') mBtnOk = wTree.get_widget('btn-ok') mAuthDlg = wTree.get_widget('dlg-main') mChkStore = wTree.get_widget('chk-store') mTxtLogin = wTree.get_widget('txt-login') mTxtPasswd = wTree.get_widget('txt-passwd') wTree.get_widget('lbl-reason').set_text(_('Enter your username and password for\n%(reason)s') % {'reason': reason}) wTree.get_widget('dlg-action_area').set_child_secondary(wTree.get_widget('btn-help'), True) # Glade fails to do that wTree.get_widget('lbl-title').set_markup('%s' % _('Password required')) mAuthDlg.set_title(consts.appName) mAuthDlg.resize_children() mAuthDlg.connect('response', onResponse) mTxtLogin.connect('changed', lambda entry: mBtnOk.set_sensitive(mTxtLogin.get_text() != '' and mTxtPasswd.get_text() != '')) mTxtPasswd.connect('changed', lambda entry: mBtnOk.set_sensitive(mTxtLogin.get_text() != '' and mTxtPasswd.get_text() != '')) if defaultLogin is not None: mTxtLogin.set_text(defaultLogin) mTxtPasswd.set_text('') mTxtPasswd.grab_focus() else: mTxtLogin.set_text('') mTxtPasswd.set_text('') mTxtLogin.grab_focus() mBtnOk.set_sensitive(False) mAuthDlg.show_all() respId = mAuthDlg.run() mAuthDlg.hide() if respId == gtk.RESPONSE_OK: login = mTxtLogin.get_text() passwd = mTxtPasswd.get_text() if mChkStore.get_active(): __storeAuthInfo(id, login, passwd) return (login, passwd) return None def onResponse(dlg, respId): """ One of the button in the dialog box has been clicked """ if respId == gtk.RESPONSE_HELP: primary = _('About password storage safety') secondary = '%s\n\n%s' % (_('If you use Gnome, it is safe to store your password since the Gnome keyring is used.'), _('If you do not use Gnome, beware that, although not stored as clear text, an attacker could retrieve it.')) gui.infoMsgBox(dlg, primary, secondary) dlg.stop_emission('response') ./decibel-audio-player-1.06/src/gui/progressDlg.py0000644000175000017500000000624011456551413022206 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import tools class CancelledException(Exception): pass class ProgressDlg: """ Display a dialog with a progress bar """ def __init__(self, parent, primaryText, secondaryText): """ Contructor """ self.parent = parent self.cancelled = False # Widgets self.wTree = tools.loadGladeFile('Progress.glade') self.dialog = self.wTree.get_widget('dlg') self.lblCurrent = self.wTree.get_widget('lbl-current') self.progressBar = self.wTree.get_widget('progress-bar') # GTK+ handlers self.wTree.get_widget('btn-cancel').connect('clicked', self.onCancel) # Configure and show the progress dialog if parent is not None: parent.set_sensitive(False) self.dialog.set_transient_for(parent) self.setPrimaryText(primaryText) self.setSecondaryText(secondaryText) self.dialog.set_title(tools.consts.appName) self.dialog.set_deletable(False) self.dialog.show_all() def destroy(self): """ Destroy the progress dialog """ if self.parent is not None: self.parent.set_sensitive(True) self.dialog.hide() self.dialog.destroy() def pulse(self, txt=None): """ Pulse the progress bar If txt is not None, change the current action to that value Raise CancelledException if the user has clicked on the cancel button """ if self.cancelled: raise CancelledException() if txt is not None: self.lblCurrent.set_markup('%s' % txt) self.progressBar.pulse() def setPrimaryText(self, txt): """ Set the primary text for this progress dialog """ self.wTree.get_widget('lbl-primary').set_markup('%s' % txt) def setSecondaryText(self, txt): """ Set the secondary text for this progress dialog """ self.wTree.get_widget('lbl-secondary').set_label(txt) def setCancellable(self, cancellable): """ Enable/disable the cancel button """ self.wTree.get_widget('btn-cancel').set_sensitive(cancellable) def onCancel(self, btn): """ The cancel button has been clicked """ self.cancelled = True def hasBeenCancelled(self): """ Return True if the user has clicked on the cancel button """ return self.cancelled ./decibel-audio-player-1.06/src/gui/window.py0000644000175000017500000000630511456551413021224 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, tools class Window(gtk.Window): """ Add some functionalities to gtk.Window: * Automatically save and restore size * Hide the window instead of destroying it * Add a isVisible() function * Add a getWidget() function that acts like get_widget() (in gtk.glade) """ def __init__(self, resFile, container, modName, title, defaultWidth, defaultHeight): """ Constructor """ gtk.Window.__init__(self) # Load only the top-level container of the given glade file self.wTree = tools.loadGladeFile(resFile, container) self.visible = False self.modName = modName # Configure the window self.set_title(title) self.add(self.wTree.get_widget(container)) if tools.prefs.get(modName, 'win-is-maximized', False): self.maximize() self.resize(tools.prefs.get(modName, 'win-width', defaultWidth), tools.prefs.get(modName, 'win-height', defaultHeight)) self.set_position(gtk.WIN_POS_CENTER) # Connect GTK handlers self.connect('delete-event', self.onDelete) self.connect('size-allocate', self.onResize) self.connect('window-state-event', self.onState) def getWidget(self, name): """ Return the widget with the given name """ return self.wTree.get_widget(name) def isVisible(self): """ Return True if the window is currently visible """ return self.visible def show(self): """ Show the window if not visible, bring it to top otherwise """ self.visible = True self.show_all() self.present() def hide(self): """ Hide the window """ self.visible = False gtk.Window.hide(self) # --== GTK handlers ==-- def onResize(self, win, rect): """ Save the new size of the dialog """ if win.window is not None and not win.window.get_state() & gtk.gdk.WINDOW_STATE_MAXIMIZED: tools.prefs.set(self.modName, 'win-width', rect.width) tools.prefs.set(self.modName, 'win-height', rect.height) def onState(self, win, evt): """ Save the new state of the dialog """ tools.prefs.set(self.modName, 'win-is-maximized', bool(evt.new_window_state & gtk.gdk.WINDOW_STATE_MAXIMIZED)) def onDelete(self, win, evt): """ Hide the window instead of deleting it """ self.hide() return True ./decibel-audio-player-1.06/src/gui/fileChooser.py0000644000175000017500000000672311456551413022163 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, tools __currDir = tools.consts.dirBaseUsr def openFile(parent, title): """ Return the selected file, or None if cancelled """ global __currDir btn = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) dialog = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_OPEN, btn) dialog.set_select_multiple(False) dialog.set_current_folder(__currDir) file = None if dialog.run() == gtk.RESPONSE_OK: file = dialog.get_filename() __currDir = dialog.get_current_folder() dialog.destroy() return file def openFiles(parent, title, filterPatterns={}): """ Return a list of files, or None if cancelled The format of filter must be {'Name1': ['filter1', 'filter2'], 'Name2': ['filter3'] ... } """ global __currDir btn = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) dialog = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_OPEN, btn) dialog.set_select_multiple(True) dialog.set_current_folder(__currDir) # Add filters for name, patterns in filterPatterns.iteritems(): filter = gtk.FileFilter() filter.set_name(name) map(filter.add_pattern, patterns) dialog.add_filter(filter) files = None if dialog.run() == gtk.RESPONSE_OK: files = dialog.get_filenames() __currDir = dialog.get_current_folder() dialog.destroy() return files def openDirectory(parent, title): """ Return a directory, or None if cancelled """ global __currDir btn = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK) dialog = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, btn) dialog.set_select_multiple(False) dialog.set_current_folder(__currDir) directory = None if dialog.run() == gtk.RESPONSE_OK: directory = dialog.get_filename() __currDir = dialog.get_current_folder() dialog.destroy() return directory def save(parent, title, defaultFile, defaultDir=None): """ Return a filename, or None if cancelled """ global __currDir btn = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK) dialog = gtk.FileChooserDialog(title, parent, gtk.FILE_CHOOSER_ACTION_SAVE, btn) dialog.set_current_name(defaultFile) dialog.set_do_overwrite_confirmation(True) if defaultDir is None: dialog.set_current_folder(__currDir) else: dialog.set_current_folder(defaultDir) file = None if dialog.run() == gtk.RESPONSE_OK: file = dialog.get_filename() __currDir = dialog.get_current_folder() dialog.destroy() return file ./decibel-audio-player-1.06/src/gui/help.py0000644000175000017500000000420011456551413020635 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import pango, tools mDlg = None mTxtBuffer = None class HelpDlg: """ Show a help dialog box """ def __init__(self, title): """ Constructor """ global mDlg, mTxtBuffer if mDlg is None: wTree = tools.loadGladeFile('HelpDlg.glade') mDlg = wTree.get_widget('dlg-main') mTxtBuffer = wTree.get_widget('txt-help').get_buffer() mDlg.set_title(tools.consts.appName) mTxtBuffer.create_tag('title', weight=pango.WEIGHT_BOLD, scale=pango.SCALE_X_LARGE) mTxtBuffer.create_tag('section', weight=pango.WEIGHT_BOLD, scale=pango.SCALE_LARGE) self.nbSections = 0 mTxtBuffer.set_text('') mTxtBuffer.insert_with_tags_by_name(mTxtBuffer.get_end_iter(), title + '\n', 'title') def addSection(self, title, content): """ Create a new section with the given title and content """ self.nbSections += 1 mTxtBuffer.insert(mTxtBuffer.get_end_iter(), '\n\n') mTxtBuffer.insert_with_tags_by_name(mTxtBuffer.get_end_iter(), '%u. %s' % (self.nbSections, title), 'section') mTxtBuffer.insert(mTxtBuffer.get_end_iter(), '\n\n%s' % content) def show(self, parent): """ Show the help dialog box """ mDlg.set_transient_for(parent) mDlg.show_all() mDlg.run() mDlg.hide() ./decibel-audio-player-1.06/src/gui/preferences.py0000644000175000017500000002146411456551413022221 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, gui, modules, tools from tools import consts, icons from gettext import gettext as _ ( ROW_ENABLED, # True if the module is currently enabled ROW_TEXT, # Name and description of the module ROW_ICON, # An icon indicating whether the module is configurable ROW_UNLOADABLE, # True if the module can be disabled ROW_INSTANCE, # Instance of the module, if any ROW_MODINFO # Information exported by a module ) = range(6) class Preferences: """ Allow the user to load/unload/configure modules """ def __init__(self): """ Constructor """ import gobject from gui import extListview, window self.window = window.Window('Preferences.glade', 'vbox1', __name__, _('Preferences'), 495, 440) self.currCat = consts.MODCAT_NONE # List of modules textRdr = gtk.CellRendererText() toggleRdr = gtk.CellRendererToggle() columns = (('', [(toggleRdr, gobject.TYPE_BOOLEAN)], ROW_ENABLED, False, True), ('', [(textRdr, gobject.TYPE_STRING)], ROW_TEXT, True, True), ('', [(gtk.CellRendererPixbuf(), gtk.gdk.Pixbuf)], ROW_ICON, False, True), (None, [(None, gobject.TYPE_BOOLEAN)], ROW_UNLOADABLE, False, False), (None, [(None, gobject.TYPE_PYOBJECT)], ROW_INSTANCE, False, False), (None, [(None, gobject.TYPE_PYOBJECT)], ROW_MODINFO, False, False)) self.list = extListview.ExtListView(columns, sortable=False, useMarkup=True, canShowHideColumns=False) self.list.set_headers_visible(False) self.list.addColumnAttribute(0, toggleRdr, 'activatable', ROW_UNLOADABLE) toggleRdr.connect('toggled', self.onModuleToggled) self.window.getWidget('scrolledwindow1').add(self.list) self.fillList() self.list.get_column(1).set_cell_data_func(textRdr, self.__fmtColumnColor) # Categories self.iconview = self.window.getWidget('iconview') # Create the store for the iconview self.iconviewStore = gtk.ListStore(gobject.TYPE_STRING, gtk.gdk.Pixbuf, gobject.TYPE_INT) categories = [ (_('Decibel'), icons.catDecibelIcon(), consts.MODCAT_DECIBEL), (_('Desktop'), icons.catDesktopIcon(), consts.MODCAT_DESKTOP), (_('Internet'), icons.catInternetIcon(), consts.MODCAT_INTERNET), (_('Explorer'), icons.catExplorerIcon(), consts.MODCAT_EXPLORER), ] for category in sorted(categories): self.iconviewStore.append([category[0], category[1], category[2]]) self.iconview.set_model(self.iconviewStore) self.iconview.set_text_column(0) self.iconview.set_pixbuf_column(1) self.iconview.set_size_request(84, -1) # GTK handlers self.iconview.connect('selection-changed', self.onCategoryChanged) self.window.getWidget('btn-help').connect('clicked', self.onHelp) self.list.connect('extlistview-button-pressed', self.onButtonPressed) self.list.get_selection().connect('changed', self.onSelectionChanged) self.window.getWidget('btn-prefs').connect('clicked', self.onPreferences) self.window.getWidget('btn-close').connect('clicked', lambda btn: self.window.hide()) def __fmtColumnColor(self, col, cll, mdl, it): """ Grey out module that are not enabled """ style = self.list.get_style() enabled = mdl.get_value(it, ROW_ENABLED) if enabled: cll.set_property('foreground-gdk', style.text[gtk.STATE_NORMAL]) else: cll.set_property('foreground-gdk', style.text[gtk.STATE_INSENSITIVE]) def show(self): """ Show the dialog box """ if not self.window.isVisible(): self.list.unselectAll() self.iconview.grab_focus() self.iconview.select_path((0,)) self.window.getWidget('btn-prefs').set_sensitive(False) self.window.show() def fillList(self): """ Fill the list of modules according to the currently selected category """ rows = [] for (name, data) in modules.getModules(): instance = data[modules.MOD_INSTANCE] category = data[modules.MOD_INFO][modules.MODINFO_CATEGORY] mandatory = data[modules.MOD_INFO][modules.MODINFO_MANDATORY] configurable = data[modules.MOD_INFO][modules.MODINFO_CONFIGURABLE] if (configurable or not mandatory) and category == self.currCat: if configurable and instance is not None: icon = icons.prefsBtnIcon() else: icon = None text = '%s\n%s' % (tools.htmlEscape(_(name)), tools.htmlEscape(data[modules.MOD_INFO][modules.MODINFO_DESC])) rows.append((instance is not None, text, icon, not mandatory, instance, data[modules.MOD_INFO])) rows.sort(key=lambda row: row[ROW_TEXT]) self.list.replaceContent(rows) # --== GTK handlers ==-- def onButtonPressed(self, list, event, path): """ A mouse button has been pressed """ if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS and path is not None: # Double-clicking an enabled and configurable module opens the configuration dialog row = self.list.getRow(path) if row[ROW_ENABLED] and row[ROW_ICON] is not None: row[ROW_INSTANCE].configure(self.window) def onModuleToggled(self, renderer, path): """ A module has been enabled/disabled """ row = self.list.getRow(path) name = row[ROW_MODINFO][modules.MODINFO_NAME] if row[ROW_ENABLED]: modules.unload(name) else: try: modules.load(name) except modules.LoadException, e: gui.errorMsgBox(self.window, _('Unable to load this module.'), str(e)) self.fillList() def onCategoryChanged(self, iconview): """ A new category has been selected """ selection = iconview.get_selected_items() if len(selection) == 0: self.currCat = consts.MODCAT_NONE else: self.currCat = self.iconviewStore[selection[0][0]][2] self.fillList() def onHelp(self, btn): """ Show a small help message box """ from gui import help helpDlg = help.HelpDlg(_('Modules')) helpDlg.addSection(_('Description'), _('This dialog box shows the list of available modules, which are small pieces of code that add ' 'some functionnalities to the application. You can enable/disable a module by checking/unchecking ' 'the check box in front of it. Note that some modules (e.g., the File Explorer) cannot be disabled.')) helpDlg.addSection(_('Configuring a Module'), _('When a module may be configured, a specific icon is displayed on the right of the corresponding line. ' 'To configure a module, simply select it and then click on the "Preferences" button on the bottom of ' 'the dialog box. Note that configuring a module is only possible when it is enabled.')) helpDlg.show(self.window) def onSelectionChanged(self, selection): """ Decide whether the new selection may be configured """ sensitive = self.list.getSelectedRowsCount() == 1 and self.list.getFirstSelectedRow()[ROW_ICON] is not None self.window.getWidget('btn-prefs').set_sensitive(sensitive) def onPreferences(self, btn): """ Configure the selected module """ self.list.getFirstSelectedRow()[ROW_INSTANCE].configure(self.window) # --== Global functions ==-- __instance = None def show(): """ Show the preferences dialog box """ global __instance if __instance is None: __instance = Preferences() __instance.show() ./decibel-audio-player-1.06/src/gui/selectPath.py0000644000175000017500000001015011456551413022002 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import fileChooser, gtk, gui, os.path, tools from gettext import gettext as _ class SelectPath: def __init__(self, title, parent, forbiddenNames=[], forbiddenChars=[]): """ Constructor """ wTree = tools.loadGladeFile('SelectPath.glade') self.btnOk = wTree.get_widget('btn-ok') self.dialog = wTree.get_widget('dlg') self.txtName = wTree.get_widget('txt-name') self.txtPath = wTree.get_widget('txt-path') self.btnOpen = wTree.get_widget('btn-open') self.forbiddenNames = forbiddenNames self.forbiddenChars = forbiddenChars self.dialog.set_title(title) self.dialog.set_transient_for(parent) # Handlers self.btnOpen.connect('clicked', self.onBtnOpen) self.txtName.connect('changed', self.onTxtFieldChanged) self.txtPath.connect('changed', self.onTxtFieldChanged) self.dialog.connect('response', self.onCheckDlgResponse) def setNameSelectionEnabled(self, enabled): """ Enable/disable path selection """ self.txtName.set_sensitive(enabled) def setPathSelectionEnabled(self, enabled): """ Enable/disable path selection """ self.txtPath.set_sensitive(enabled) self.btnOpen.set_sensitive(enabled) def run(self, defaultName='', defaultPath=''): """ Return a tuple (name, path) or None if the user cancelled the dialog """ self.btnOk.set_sensitive(False) self.txtName.set_text(defaultName) self.txtPath.set_text(defaultPath) self.txtName.grab_focus() self.dialog.show_all() result = None if self.dialog.run() == gtk.RESPONSE_OK: result = (self.txtName.get_text(), self.txtPath.get_text()) self.dialog.hide() return result # --== GTK handlers ==-- def onBtnOpen(self, btn): """ Let the user choose a folder, and fill the corresponding field in the dialog """ path = fileChooser.openDirectory(self.dialog, _('Choose a folder')) if path is not None: self.txtPath.set_text(path) def onTxtFieldChanged(self, txtEntry): """ Enable/disable the OK button based on the content of the text fields """ self.btnOk.set_sensitive(self.txtName.get_text() != '' and self.txtPath.get_text() != '') def onCheckDlgResponse(self, dialog, response, *args): """ Prevent clicking on the OK button if values are not correct """ if response == gtk.RESPONSE_OK: name = self.txtName.get_text() path = self.txtPath.get_text() if not os.path.isdir(path): gui.errorMsgBox(dialog, _('This path does not exist'), _('Please select an existing directory.')) dialog.stop_emission('response') elif name in self.forbiddenNames: gui.errorMsgBox(dialog, _('The name is incorrect'), _('This name is not allowed.\nPlease use another one.')) dialog.stop_emission('response') else: for ch in name: if ch in self.forbiddenChars: gui.errorMsgBox(dialog, _('The name is incorrect'), _('The character %s is not allowed.\nPlease use another name.') % ch) dialog.stop_emission('response') break ./decibel-audio-player-1.06/src/gui/about.py0000644000175000017500000000422211456551413021023 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk, os.path, webbrowser from tools import consts from gettext import gettext as _ def show(parent): """ Show an about dialog box """ dlg = gtk.AboutDialog() dlg.set_transient_for(parent) # Hook to handle clicks on the URL gtk.about_dialog_set_url_hook(lambda dlg, url: webbrowser.open(url)) # Set credit information dlg.set_name(consts.appName) dlg.set_comments('...And Music For All') dlg.set_version(consts.appVersion) dlg.set_website(consts.urlMain) dlg.set_website_label(consts.urlMain) dlg.set_translator_credits(_('translator-credits')) dlg.set_artists([ _('Decibel Audio Player icon:'), ' Sébastien Durel ', '', _('Other icons:'), ' 7 icon pack ', ' Tango project ', ]) dlg.set_authors([ _('Developer:'), ' François Ingelrest ', '', _('Thanks to:'), ' Emilio Pozuelo Monfort ', ]) # Set logo dlg.set_logo(gtk.gdk.pixbuf_new_from_file(consts.fileImgIcon128)) # Load the licence from the disk if possible if os.path.isfile(consts.fileLicense) : dlg.set_license(open(consts.fileLicense).read()) dlg.set_wrap_license(True) dlg.run() dlg.destroy() ./decibel-audio-player-1.06/src/gui/extTreeview.py0000644000175000017500000003307111456551413022230 0ustar ingelresingelres# -*- coding: utf-8 -*- # # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import gtk from gtk import gdk from gobject import signal_new, TYPE_NONE, TYPE_PYOBJECT, SIGNAL_RUN_LAST # Custom signals signal_new('exttreeview-row-expanded', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (TYPE_PYOBJECT,)) signal_new('exttreeview-row-collapsed', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (TYPE_PYOBJECT,)) signal_new('exttreeview-button-pressed', gtk.TreeView, SIGNAL_RUN_LAST, TYPE_NONE, (gdk.Event, TYPE_PYOBJECT)) class ExtTreeView(gtk.TreeView): def __init__(self, columns, useMarkup=False): """ If useMarkup is True, the markup attribute will be used instead of the text one for CellRendererTexts """ gtk.TreeView.__init__(self) self.selection = self.get_selection() # Default configuration for this tree self.set_headers_visible(False) self.selection.set_mode(gtk.SELECTION_MULTIPLE) # Create the columns nbEntries = 0 dataTypes = [] for (title, renderers, expandable) in columns: if title is None: for (renderer, type) in renderers: nbEntries += 1 dataTypes.append(type) else: column = gtk.TreeViewColumn(title) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) column.set_expand(expandable) self.append_column(column) for (renderer, type) in renderers: nbEntries += 1 dataTypes.append(type) column.pack_start(renderer, False) if isinstance(renderer, gtk.CellRendererText): if useMarkup: column.add_attribute(renderer, 'markup', nbEntries-1) else: column.add_attribute(renderer, 'text', nbEntries-1) else: column.add_attribute(renderer, 'pixbuf', nbEntries-1) # Create the TreeStore associated with this tree self.store = gtk.TreeStore(*dataTypes) self.set_model(self.store) # Drag'n'drop management self.dndContext = None self.dndSources = None self.dndStartPos = None self.motionEvtId = None self.isDraggableFunc = lambda: True self.connect('drag-begin', self.onDragBegin) self.connect('row-expanded', self.onRowExpanded) self.connect('row-collapsed', self.onRowCollapsed) self.connect('button-press-event', self.onButtonPressed) self.connect('button-release-event', self.onButtonReleased) # Show the tree self.show() # --== Miscellaneous ==-- def __getSafeIter(self, path): """ Return None if path is None, an iter on path otherwise """ if path is None: return None else: return self.store.get_iter(path) def scroll(self, path): """ Ensure that path is visible """ self.scroll_to_cell(path) def selectPaths(self, paths): """ Select all the given paths """ self.selection.unselect_all() for path in paths: self.selection.select_path(path) # --== Retrieving content ==-- def getCount(self): """ Return how many rows are stored in the tree """ return len(self.store) def __len__(self): """ Return how many rows are stored in the tree """ return len(self.store) def isValidPath(self, path): """ Return whether the path exists """ try: self.store.get_iter(path) except: return False return True def getRow(self, path): """ Return the given row """ return tuple(self.store[path]) def getRows(self, paths): """ Return the given rows """ return [tuple(self.store[path]) for path in paths] def getSelectedRows(self): """ Return selected row(s) """ return [tuple(self.store[path]) for path in self.selection.get_selected_rows()[1]] def getSelectedPaths(self): """ Return a list containg the selected path(s) """ return self.selection.get_selected_rows()[1] def iterSelectedRows(self): """ Iterate on selected rows """ for path in self.selection.get_selected_rows()[1]: yield tuple(self.store[path]) def getSelectedRowsCount(self): """ Return how many rows are currently selected """ return self.selection.count_selected_rows() def isRowSelected(self, rowPath): """ Return whether the given is selected """ return self.selection.path_is_selected(rowPath) def getItem(self, rowPath, colIndex): """ Return the value of the given item """ return self.store.get_value(self.store.get_iter(rowPath), colIndex) def getNbChildren(self, parentPath): """ Return the number of children of the given path """ return self.store.iter_n_children(self.__getSafeIter(parentPath)) def getChild(self, parentPath, num): """ Return a path to the given child, or None if none """ child = self.store.iter_nth_child(self.__getSafeIter(parentPath), num) if child is None: return None else: return self.store.get_path(child) def iterChildren(self, parentPath): """ Iterate on the children of the given path """ iter = self.store.iter_children(self.__getSafeIter(parentPath)) while iter is not None: yield self.store.get_path(iter) iter = self.store.iter_next(iter) # --== Adding/removing content ==-- def replaceContent(self, rows): """ Replace the content of the list with the given rows """ parent = self.__getSafeIter(None) self.freeze_child_notify() self.set_model(None) self.store.clear() for row in rows: self.store.append(parent, row) self.set_model(self.store) self.thaw_child_notify() def clear(self): """ Remove all rows from the tree """ self.store.clear() def appendRow(self, row, parentPath=None): """ Append a row to the tree """ return self.store.get_path(self.store.append(self.__getSafeIter(parentPath), row)) def appendRows(self, rows, parentPath=None): """ Append some rows to the tree """ parent = self.__getSafeIter(parentPath) self.freeze_child_notify() for row in rows: self.store.append(parent, row) self.thaw_child_notify() def insertRowBefore(self, row, parentPath, siblingPath): """ Insert a row as a child of parent before siblingPath """ self.store.insert_before(self.__getSafeIter(parentPath), self.store.get_iter(siblingPath), row) def insertRowAfter(self, row, parentPath, siblingPath): """ Insert a row as a child of parent after siblingPath """ self.store.insert_after(self.__getSafeIter(parentPath), self.store.get_iter(siblingPath), row) def removeRow(self, rowPath): """ Remove the given row """ self.store.remove(self.store.get_iter(rowPath)) def removeAllChildren(self, rowPath): """ Remove all the children of the given row """ self.freeze_child_notify() while self.getNbChildren(rowPath) != 0: self.removeRow(self.getChild(rowPath, 0)) self.thaw_child_notify() def setItem(self, rowPath, colIndex, value): """ Change the value of the given item """ self.store.set_value(self.store.get_iter(rowPath), colIndex, value) # --== Changing the state of nodes ==-- def expandRow(self, path): """ Expand the given row """ self.expand_row(path, False) def expandRows(self, paths=None): """ Expand the given rows, or the selected rows if paths is None """ if paths is None: paths = self.getSelectedPaths() for path in paths: self.expand_row(path, False) def collapseRows(self, paths=None): """ Collapse the given rows, or the selected rows if paths is None """ if paths is None: paths = self.getSelectedPaths() for path in paths: self.collapse_row(path) def switchRows(self, paths=None): """ Collapse expanded/expand collapsed given rows, or the selected rows if paths is None """ if paths is None: paths = self.getSelectedPaths() for path in paths: if self.row_expanded(path): self.collapse_row(path) else: self.expand_row(path, False) # --== D'n'D management ==-- def setIsDraggableFunc(self, isDraggableFunc): """ The function must return True is the selected rows can be dragged, False otherwise """ self.isDraggableFunc = isDraggableFunc def setDNDSources(self, sources): """ Define which kind of D'n'D this tree will generate """ self.dndSources = sources # --== Saving/restoring the current state of the tree ==-- def saveState(self, nameIndex): """ Return a structure representing the current state of the tree The nameIndex parameter is the index of the value that stores rows' name """ import collections queue = collections.deque((None,)) expandedNodes = [] while len(queue) != 0: for row in self.iterChildren(queue.pop()): if self.row_expanded(row): queue.append(row) expandedNodes.append((row, self.getRow(row)[nameIndex])) return (self.get_visible_range(), self.selection.get_selected_rows()[1], expandedNodes) def restoreState(self, state, nameIndex): """ Try to restore the given state, saved with saveState() """ (visibleRange, selectedRows, expandedNodes) = state for (row, name) in expandedNodes: if self.isValidPath(row) and self.getRow(row)[nameIndex] == name and not self.row_expanded(row): self.expand_row(row, False) if visibleRange is not None: self.scroll(visibleRange[0]) for path in selectedRows: self.selection.select_path(path) # --== GTK Handlers ==-- def onRowExpanded(self, tree, iter, path): """ A row has been expanded """ self.emit('exttreeview-row-expanded', path) def onRowCollapsed(self, tree, iter, path): """ A row has been collapsed """ self.emit('exttreeview-row-collapsed', path) def onButtonPressed(self, tree, event): """ A mouse button has been pressed """ retVal = False pathInfo = self.get_path_at_pos(int(event.x), int(event.y)) if pathInfo is None: path = None else: path = pathInfo[0] if event.button == 1 or event.button == 3: if path is None: self.selection.unselect_all() else: if event.button == 1 and self.motionEvtId is None: self.dndStartPos = (int(event.x), int(event.y)) self.motionEvtId = gtk.TreeView.connect(self, 'motion-notify-event', self.onMouseMotion) stateClear = not (event.state & (gdk.SHIFT_MASK | gdk.CONTROL_MASK)) if stateClear and not self.selection.path_is_selected(path): self.selection.unselect_all() self.selection.select_path(path) else: retVal = (stateClear and self.getSelectedRowsCount() > 1 and self.selection.path_is_selected(path)) self.emit('exttreeview-button-pressed', event, path) return retVal def onButtonReleased(self, tree, event): """ A mouse button has been released """ if self.motionEvtId is not None: self.disconnect(self.motionEvtId) self.dndContext = None self.motionEvtId = None stateClear = not (event.state & (gdk.SHIFT_MASK | gdk.CONTROL_MASK)) if stateClear and event.state & gdk.BUTTON1_MASK and self.getSelectedRowsCount() > 1: pathInfo = self.get_path_at_pos(int(event.x), int(event.y)) if pathInfo is not None: self.selection.unselect_all() self.selection.select_path(pathInfo[0]) def onMouseMotion(self, tree, event): """ The mouse has been moved """ if self.dndContext is None and self.isDraggableFunc() and self.dndSources is not None: if self.drag_check_threshold(self.dndStartPos[0], self.dndStartPos[1], int(event.x), int(event.y)): self.dndContext = self.drag_begin(self.dndSources, gdk.ACTION_COPY, 1, event) def onDragBegin(self, tree, context): """ A drag'n'drop operation has begun """ if self.getSelectedRowsCount() == 1: context.set_icon_stock(gtk.STOCK_DND, 0, 0) else: context.set_icon_stock(gtk.STOCK_DND_MULTIPLE, 0, 0) ./decibel-audio-player-1.06/pix/0000755000175000017500000000000011456551413016564 5ustar ingelresingelres./decibel-audio-player-1.06/pix/decibel-audio-player-16.png0000644000175000017500000000165311456551413023503 0ustar ingelresingelresPNG  IHDRabKGD pHYsu0u03rtIME :~8IDAT8u_hu}{;6vHF"ThѨFMJEхuS "dP:' cΝmng;.ċ\<anBbeBgd>'w.Y_xtt;N?<\7htzٟsho+c7C}eKʉJh%Gt.Aς/xK䷁Rʀ(PJFm5k1 "MaIEaHDAadsy7_WS{Beۏv( kyM< *$ Nl0ߞzCcA͢EFh9 4r.uTw#uJOh,!qH7)\XjDlԖX_:2t2G,-5IaӑMSJ!ɥ]]FPj@*aưZ)RqL45dˬ-?O]f``Lrzh4-ZFr+MoC~WQ @HB )db/>'09Iڇu9vyRbX $NR)d,Əd C=Gը~jH)b0L 22ؚwy frYvgntXZh乏Ξ<CPIENDB`./decibel-audio-player-1.06/pix/category-internet.png0000644000175000017500000001355111456551413022742 0ustar ingelresingelresPNG  IHDRJ4-sRGB pHYst"btIME  "/bKGDIDAThZ \Wu}}hF al2f_H TRCN\)XT*E* &IE2;X,Y,iK3}H(Aۤn^ س w<iQxЍ} 8gϚ&\xo/6="1C[6m=@~} :E( e%r I_QɬKg<2{?p#[pwmh`)D"H Ȫ6+$30y}&/ʉ%4ǩ8Y0ex`~qZz;nN'MK(0@0@3 @ [,k`kȁKAăsGN*3(g_;u 7! ,ίc,ӟ۾k݂>&;P*7P,ͅ@.}Jk T@*+ TMMai&뤜KԶ:74PR F0~Gꮝo+ tEDCD {?hڵU\Nq mɹ[1]xjddΝ{LݹAFBjёom祲 P8#RL#0oŋA: }mȴf&PFS*!mkorV*ÉI8wq2D|[ii? =k SxC0 KQ'x뱶hO^Eq ƪe][ʖ7_b:J+1ƷAP4s98,% '( ;/O@&GM3٬zZC _ YO>y;~)׏~qmA7hH M0\1 E]Fu( f*v+|kBHaL^6}؅}.An9|RP,ܜMCR2#TTiTEGk BgSՄT2 K<\9"2&ba]"csKTӊ:d(w c}sOmoJ:[d2 H%2B|!(tBIA 8Ӏ֨Z1U˲ Ͽr:z9Ů}Nf}GN7Q8qG1|O72?N1$2&ժNu\Bx ئ'i1fUb-V (+ ܉5gG`w 04;e6t>3w67wF S…5wc:0jr&Mؾe߳$^Ϡpu$:m1>1;}޽_|?M,1"Sw=wB,dD6 X[ sB"_ $<l;:EdE XK,*\:t Ki( PXA9vn D~0B:[ҍb4??ԕ+o%燳2i ;a~);x$bLGI]}H2'TUuj@-O^|ii{ZQϗlP(@FУ`+N'JP.U7b"sg+;@ɖgyܽY{!}>t.gT&2BmBԋ4k`uu&6X{TZv0ꐳVH/Mf2n ~QO){6#bhRKMmEGDb>zDH)jLGd iL_ b [#qf> \afՃSYA*A(^́ąi~ k1xoʐLYsk0섹 UVAbXecC-`Z l1`U>KiTdHJ0@ 岿!@auD橗A0E:X׷!]ԱSD1RkF 0;4,,=0oeS=` h$A4W:"bJѨHH /_w4EM4!Xi4uu 髌S>/g-p :Ş( ": ሟ=/T(ShP\\Tuң8}g*gz}qC瀙<^t {-} }U َﰰ Xu jD0(@ElLSEjokY+$*%6T"Z^3h k61,éyOW O.@YsU e(.l}+{!BRU r6r­*Bu3 tJg}aQ4l-:]i415[ZZ=.l:G[tK cBUFz.DU(mVGs%蘙2s21d$-V,uRuFXHf茽gM@+ia>ԩCZ^H!gN0/xSo Z>}nBevXeYZt]D+RDN!D>hnC S+f:HtPɡ3c \8f[;xZCeM]aHd:3Iԧ ^Z!lrE ƧP>0#55j׫Qz6(L-lN3bPn}}+N,>鐚X$;XBnީj;26w S %4R./C*W;-L+,Y fXQV@PH-!BPH\Xhǁť=̖Y.]E)ŧjnW񏧧/h j-2Pk_a][QtYdGbGf`s_ `nv9o577Yjg(ET`*of lYU`~M !zW>Tg?@ ol&6OR|b~ȿ.;뤺{sַM⑑yH江QXҺT Y"BK#cKpIp:EؒpYXPĒG>zʠWv1j]g2Ohjq<#54Z_& ,?'us(W oNtj+BǪpL kPo>&\FX5:E(޻t[>~nB>q:;h11~hь럟?klut6 9*è߫[By%׈Wg20g< G`cgCnq5/ݗ0|T*T,cWXHe.e(J>]+uwwb<1غ.ov\AL;'ͭp{=dߥ6LtE%#&ny$bn$?p [lڡ-ݡTʓdH@9Q-OVqę}b{2i>Fn5>fg]xN <rk{E[&2#p\lky$G1ԣ/tۣe$rV8)Ωj,b'Z^=_8ij))Uatd DQM%H. E3rtLGҤ`Sx `CG`XuMtMܽ-0o&˩ė307b\ G2Ȟ<)iALLLlF1sk+ʲ&Nvo]XQ1H,wy݈EC[ 'FGB4_3W&1tIӗҒKB]ۭ @RR ,Svqq1 /$ H2͹% C3#ܳUJے37_ZS7]Uu$dw|W?=9h9s[LL [jv8Jx:bٔY^^N!$ @:az?BOO]o9SSx7!,!OD:CwW>yw xSqn=\179Jy'YMj@ʡ.e4f\ J9r$E)Qi=uXg?X=ׯ/4MMe;8zXG3qc7ms74pcr~td΁*+S(*(4yu(n>(c~6z5ө e(^ Faefff=\lzUvng>!| W!pҔp++HuC-ꚜGəd.b~b\04~rTe%dqA_|9}ռ RNMjɵJW"NTJjhv7N5dFvK MUTT\jLk 5:kP+`١^Cmx8% kK2օb:Fjm1js 5*FB !NjoIENDB`./decibel-audio-player-1.06/pix/star-16.png0000644000175000017500000000153211456551413020470 0ustar ingelresingelresPNG  IHDRsO/sBIT|d pHYs4tEXtSoftwarewww.inkscape.org<tEXtTitleicon_starQ tEXtAuthorJean-Victor BalinJL'tEXtDescriptionjean.victor.balin@gmail.comQtEXtCreation Time2008-05-12*ItEXtCopyrightPublic Domain http://creativecommons.org/licenses/publicdomain/YIDAT(uOQ?o[")?P` D x7AJ7$O7PJJ,!]زX˛yDUq($e?Cib7Hp^_{X2sa?PO} UJx'q(㽰~I+ ̍{XD1wn>elZi-JraJgR.  C Q:'J6}y0ȈDFHqSӯ[U%e{aN;vҕ(Z 6txq(o^;#tm*4S eٿWY*3nV']\"]o G!]h\Qzݱk&8E پo-n5HɔH>2IDATxM`kpt Y"ٍkq:f ĤMIOSU$d9~<4M^|-erb6{ޗeDD,6X_;t:d2fNLRUU("4RQUˋg{+YuTU B|{-GZAHwBH t3f[`hZ=ԊHk`vk5V|ׁr#ѴtDgjaGkuD#AHVHBz퇎DӄthށU9:ґn?X+X+X+XkCGmITS+X+V{$kkŗX뽮dXZG:chZu$ږH BtՑ $DHSk{$kkŧ[rt#GHHH{F#Y+ ;x$# #aŲ=:H~DDzfYY|$QLY1 rDUU\V1TU􊢨rtIME &UbKGDYIDATh TTWΤ;vFOfd2iLǎm<1FzÜ;vt;.LnW\YEhRR^Rl*( K^Y .qI;w޻޿w_zoߎ`Zjjꏳ, dff1--mX,~V??̿Uֆ'2, IDyyBCC!J# E:[:f~t[ł-񨮩A~~>!DHIy9MMxoo333{[-tbȃM@pp0cҥXr%,--c^lذWƲe˰n:8;;#99{:P5oH6mQIiiVBSW_aظe|"Uq #*!+<:/ix&aXf Ν;Ye646"##kDrtt\$xPL'b (y(:cuǒ\я!&&hyOdߴ gϞRU] d7o݆zuO[\LD(ac5nˠ$YDuc]gem)-+k9s朩 O UU`R`6L =PqW[Z4WP|n\nV&G)+އY;wBTn롥8x =Y666[˥R0hă5|RȹM\<+b/ |rǫo_~Am!ԏi&U M9:)IzqZV_|(i-^@ ?6ܹs-É꽬ۥ4pg~Ru|1TSPs2ZX9ZEɒOp?:ظ86^ #ߜH~}v20(NԩSHoKõD:-t߈ ZCwh:?#H-.:aS˥*"bߏ\ɭq񰵵] l TFo}#\ex(N{E+P'ngLx &(?urj̓aapquTjUqTk /qoxHtފGɴ8Y=}zhNH)BC(:`HO7c}QFР1rB +vY99m]vd?MX|  AqJ(|.ޔ=G]'u8%ej#_jUj(2.]}3oøC|ꑆb Ej(pKS>אVJFw:QB-! r*܄blpӎ"5i eqivWGaY 5*"m22Ja0'Rh V$%{`@j{'B'(.?Nd5M;\ *XE][ 48]EhZ-cD}zXW`Ke^T7&.tt@Y\H yyC=*aCXd|gj8~c(284Qmuuwg#O'BL(aTTkN^8QҡK0DMjD\TWgS .Q7 i"E A1jt鹅;Za$!(nEBZ5߻WiBge$J6\:ͥ,NHF΄  < 6u S2,15*ܣ.EgQHsn-6al2ky#؝8 Cqb54}$^DI@ߟ:ۺkϞddf^^9l0륫װF! (֨Q @ H :=M/F>={r?!.앐StfV̵٫M^l}=15@S)(Y'd f*$bZ'58 2^ 'C,#95ׯ_M\C;}gXagsS ojFtg%Ha_\'›Eu=AEC{q4Jpvfdh^y߲y7w޼陙zb%Uu+bO1bHu\Jςe%u<Ҭ%[BBned18lK~-CD߇qiPKT ;Of_2Pq8I$ 弝q޽B6(5x n)ӇnoVnC\8%z-NKR&yY<۾Zh[RY6wZ kn.(<,fj555HNh}5pEu5Auu5Njøܸ1lf_bˆQp)yicNJ"`JH0aR*pY!ؑx6GQ $rN;W _څjn70ۥ8 ֦:K q'Suݫ)\>!4"B ǹu ՛[@\e ¥tc@yyMWf)6'/ gܹl4w 0>03ݽ)L(XXWŜw]' -UaX{kaa̘1Ő<[+=>>]aKp=<\g}D雳fy ۢ'2_v]X,JP =,)%3gE aaCޛJۋvŷ ]R%K8PpLW'ř`@K WCB~~w]ϟo9eo_~Ӧٳg{oc/ S%O;3tG3*'kcxxq.6~hdNK&"xÐw`XF$XR {0_}пm;w ]o>44A{>IENDB`./decibel-audio-player-1.06/pix/decibel-audio-player-24.png0000644000175000017500000000342211456551413023476 0ustar ingelresingelresPNG  IHDRw= pHYsu0u03rtIME ,29bKGDIDATH}Uklg=ӻ~ڻk'Zũ' i4nGiD@ʣ /@4V %HM$u5ڎ];]kv3o73s=76>˶ӳn(*Wê=qܘ,˩z\?P~SP"^j¡1r";yA[?T6)vx$o&SvG_y̘]%- (t.4o~c/Tؑɝi|~b%T\ʦ}?e2_,g?8Qި'm0 tBSЕsNVWyA|rdnP,(I%8|\8-7t̶l"`a6YFOW^`owj6ۚ~`Q4) w2A]Cr 琏_`NO~%O0tPcH QUWUiP(TVrTeőku.m޶ [!ehP,V僎vi.]S6P XaӚH&/GX.s>j:?+ Ť]p謩jsUm\:b-Q!QVRliJ D(MztP$& I@n4_R) |x hɧ4T}uMa2蔈2ihM`hNtRH:Ng;wA .gUJL69)mZ5M9HoC0t.PkE>1ྻ-1?<>4Z9^r]$p}nݰdg(mLRؚ&R1᳏}giyGzm~]6/[LbfP/bjz3I~^ҜwqCC{bHlOgMGbsr<;e{h4F%DZC{^(\VFH 9xw4njvՏ%B,ϟ?p8W8 " ^ͅ;v_[h#;&$&=( + ڙӨw'ۅc_GzE$;(ʰ*<N=;ks>uC_EcI /qMc}m6VSVZs>? ֨<\P۴ ??CvYиWF }vmO0ͫ3 Bn ULa]33> /IENDB`./decibel-audio-player-1.06/pix/decibel-audio-player-32.png0000644000175000017500000000517111456551413023500 0ustar ingelresingelresPNG  IHDR szz pHYsu0u03rtIME uGbKGD IDATXÕW CaW\h+(jJGEmKik|Uh%jL۠iXIQPA ".w>gޙ`Qgd;;|b`Fܳ~=ͦzC.A0Z Ey0 Ӏi0d%?#qdryo2͛݉X eJZ[[\tT&XY)4iLFgT6H0>>^X>L/e`…%Zxr&sx8h"EJi"⢮iiuH%a$"Zu+})k׮Ͽ#WM^+$9ഗ9l,5+䴥JgS$Wh!<KoXnkɁ¡ʺZT6@|@*+tKFDĎ("4DY(=.:PƁ#Xr3JgbRSFQuPv@ NzeZ͆&-5&eۂڪ - $^_ђ%^:֨f  s(95ANUDKQWWJ* \aT*IJ_އ 35IS8䴡`IRK:fGT2[rtq,@2s;iDcHT7D .9=^bڿ9& ΂KPr{MdehXil3N-( ۅʊ xnrYCGaGspO0$YzhIUyZ &DS\44%KQy^)ɨK3$М>G,F{4gRAolhm9 ?jIPSUadS$7ۆ$}Z\ Efd4äAԔ +p!75Eg:wK2t z! @.=߂ezex믊jǰxbOM7('wx&MNHg2=Y(c{ P\hrUձsLM0'C{l pN{đC )֌.~lݶ.L&&9泸8iݻwG6>O4{v^'ryԅ6*vG*bJ1ĮwmO7['uGwяE,%qc8rh?nurZZ,-G6^Eeaz$9_ })%D}|4)\J47ހCxrǏ}&:W5-4PQK#C;Oߺdd[,%&Ov+]I Lc~7SHU5X*򨎏L~Ktw2YLRGmU55bh&l=MMNJ))O%gR1ۘCKR\2KG;|bCt4IENDB`./decibel-audio-player-1.06/pix/cover-gloss.png0000644000175000017500000000643711456551413021547 0ustar ingelresingelresPNG  IHDRrk.sRGBbKGDC pHYs  tIME O IDATx]r# TC%LW%y|w8ȃɫ 4fgIJǭbIH Py</'IDO$x'I}32pdb/njC,Β:+nX6pQxD}PGasoi3JjD4~y9%WUƂFdi(_Fީr7Z j`Q? 2E)a-+ 䱊d{# r" 3paD!ѡ@yVrWм0UDƞ3#+KtstBPd lwebEQ8lk1-yc\#a!ʋǾ@Ȁb}`e9V*F@DZYgV3FqÈoRZcA" J"GH.)GȰɢk(Fx cd2Z̄!ˏ%@6U*WQ^5 #x@t?2oɓ-`W?2]y*f1ߍJ5-ɑK'Zzj0>(Ӫ" rn8`y$02EڕyYB?֎-iZ,1YJ ^9EV֨ h-x!ʔ)=2್ `2&y',5D` D }:CeUl o.xOaÆQ{/'f!s ?ojE+2 NWwG) Q3X!q6FvָiN7nXX}2U$&.y*2% Y-9s-ȅԛԉ,+A-G^ellʕ wj@#}׫}VȨ~%L~ʑ(VlxHflM΄Y5+0M&w1`JFfHG,c<"%J cLuib 0ˏ!F :B,z< 3&le,hhrveFP5>Z)tkGJ{:k%A@4kF.(n߂>;K.dKgVs޹XÏ|FJVuX^::R=|X ˶1"v;d6 Y&~w"m;DS{7xRU&001*2e xv092xrkVQfͺò;_ڵ׎sӹPEmt"xHPC=e!ZnޔҚfG1F`T*S,Gf7w-[nRvX!nC+L"zՇ֨ )B_=dxOIY8.]GBCqbB䚚K yzoX:;x%_)V(-1R5Rx@Fe0G#o$m!iTJE5)Mmn^7 lBx\kۍm!] V! H~ TS|JCXSB @l:/ B*#g5grmj5mٲedvȑcjMI!U&uHRdj60S`m f ㇿql,ab@d^)>ԴxoB2Ե:z]SJ Z[KI/#%RʳS$Kׂ{7%U~<,ash?PO<'JX(DՄuN҃kfq$mKqXiPRJ"C/R2ȝ ߯{iA=B`a q]$-X$hʥ h4ze&[piZ{` |ahxg7BJ3ڄVMf;䇏=B,E+%,im %%XLW?nۍа'qjRS`50/~e= L+zzzYZ[[q~I>?I6#u:uD2I6IWWɶTKĤ$JsKݠl^J8z\{wrU=Bu4BJ0 PAHR؎cƌd3Yҩ$hٳg`sKwC$mWoy'?( @:DT2I"DZVxGP!ݝ v]j^t*waYdIV/[=42O@;;WOۍ`9n&\ T4vٶ ۹8tw'H$1 sۏ2g_MYKH&F\,F)E\fll?ةƲ'O8S,=$3I%8M"\pj0<Ё|5::Y~/WjZ@sB^ Tdm ˶,;xy&mml"q%4!M`n\R$P}"˼sA:wޅ}sl'm^μ3];vmW)U,eY;c9BX6¶l˲Y+qY|sŶmV˓XB>ҥˈEH,H,_-XJ qFcOѦ,aNL&Z&[KM'H暠]H:$Sk1{)NRqAA)d7Ie0&K%G|IuIg2oO#"Q,ms#3/}/&bQS)+ПBö06²Cua&lvkxܻp ,hqu7T*Nri{ b(M˓H_"m8kV)EUOٽGjy3C z6L-,mc²lmc+4lի/K*.Q,cn۴qj5>3 >Í7݄%q2 Bʕ*hҩ4X]_2-^ilյ\*S,F8nlBYרU+k֬J0jdx$‡֬۶RmNv;@Zcy;q=xArY* geчC_{޹hg:~ջh6劇FƓXXA.D9\yŌ96cc#5ߣVRV9wZZHL?t'x&4({vN0Q`ܹ^ھ/g7woeբEfA1ͽP:3-==VE<93gSF\Jgj5T˪u ;_܎R o=tWI gK[g|bZr\K8p˰wl6]'3V(]}o׮?v@Ŷ/\nV_߆D:SU###NWwpRQGkOla`  'N"# Va%4^0`@5m0b=D%cV$''`jrrYV+Z l&/̙)Vo|@0Dm7#Tʸ0:446PvDe) ZEgKE@ͪXJTK߻MUUb͛wՊu?_]S|.4 3jF|ԧ맗_L&EA :ox s*|rFzhWo|gߚHe׬~CXUDd e4As=5N% ΃/1J{A1uoPkGGǕ-7,~[|;k(upk&,ȋ<CxB5:@bX.FLU7_.i~/y \k׮lu8ꆧ_|ƢQ1cXu#=Ⱥ?4B13ge;vJēP KY*\wK Xh߇뛮'=-m`ڸ=Zm+x.2#u:f%@54P9ܐMOpy016ӾebYyw<?񵵵u\rS 'EnɍW񪪧 Sd=24>#I $`l?;x@}2fӊan ]}u};gɀ|`oe4[=\DӣKdER=ez䴴K1*B0T'NE ᜚.X^wwXt-N*&޽π;X(.ʭW eL2x WԲPTNeTWK`E73Dċ^h1u_xǓv~o5;\.w_B ףp^Q5c)nhz֌UX)S"k P,]P|D !0z4 PUY49KߌQ޽/>vEx2Î;nRqSUMU}c{_Uy9kqU}-eA)~lg3 2f9e<t0UIzIWܺu5"[ P]WzEբLPCCFlɴIVG H,)<Y%aI&W?rvr*m۶l6ۚ7:"dYn)5aXKZeY-kUgeRF<,}V?Qk`IH'&R)h{?0l޼ ʩtvTԠ" %c Ӛ)k gd"bY@*j 4sں0<@O&eH#6:{.ehT/>عatlbvv@M"e f,ӕUy`R̡ $F%RC^yfR :Eab|T_@A5nkvK._XV8g_/n*gwn@zZz>2^s֏e,ZzQ9 %C yp{|F)<6 TՀYUk&Ă;`$vڙI5.ѮJSW#_2Rbό tek?/%ʒ4歱Nks#kh&%}Tb"Oj Elhj:6kdz}s6|U~ٗq+Fq6׼ҳњO.̙Cs^@S:,Tm3['2T f0xZH]}MKsYg$Y$7૪ԙ:1$xssn0uI漯qBOhH9NbTFѱZ>±#Y614pD Ęh0WZ]i9q*x+_C'8!Md,2<DPѺԧ@Ň`t!dL:%t=Ppf0}l%!u!k[ֲj)C@=ma|k#K] Edbu-A$:DJUv32$բrM-Z hD*d,͵PWW%ٻ*+*:'d `+GG(⨫hOoG%gӦD,nV>SꓲSy D gK/eYPO3Z0+^QAC\~o÷]P"o7kxt );ZW|C+ӒD~$]8Mua &(~J`C =f)aC'v]=AرV9{s>Zgr7L?xF7GZ 92Ae)ٗUb ST ɠ5koUZS'c & $rXyUĬ O²k/gU2PW;. v4z fŮx$f %K_e&3è0[f̚p:-Y! P:}-YF:֕J=r2*J\Ey뫃PI;c&eOW,l(`*[-`fc(F!Ǐ9m3s%HD*v8 |q@A`DS\y ;s?3XL@^*`R``'ژ"Kkp{m,xᇡ16"#׮^C=xAg߱c&ٰrym!ơe,ǂ U\W%p$DTd d5"AuBi =(P FL X=0ؾp0$sH|i]{ {sH;,-b)T4NT$i} 4,'a /| h 6{8X ?gAYJgXS}k_Su55Za ~ϩ>850it(Xh WS0]}zza_?mN6}{D%:Q\k^}:7x|tl FFF!Bx4~DwV]h|MbCuP`N$<T V/뀍oaut`v΃!$3-.[KqUKQe.p+F_i ׾)7,:/7=̂? J I.%wA^\B(,814 1C6K/Аa(v)Fa2 ]҂0mL- <ꂞ 6xrkYb` dj?l`52~3QOҌ*oF>ܘt vENt}>c"Xd1,3qtn /L\V> Qݶ68e )^CKufXȜW#UpUp]w@;1Hv-33M@6( .h6Ź/۰peP ##g: l6d4f8}Y JFhՌS"LNJX)poT .\.p5|;߅G4sx4{َ-0orp#o%N1o&,WW@Ke2x(=oTyEޠfh7:24[W)3r`FXeF!^ vgPn0pU)+|/TWlE —t;j#@KSiOK/W]H9?_!%YU뭈AI 6:ނV[qxrnXn MN6`lxp`osSsK"it!JZٍI QPy&h)j)d ̛=n̵l܎4s Ƨx~⑛6]]uՀ 3>;* c846Bb`0UdsZZa 3}fg'Gy;G;iv[ kNHtLjtS߯E^@UFǐ/+D67Xr*H=td*DϲUr}5f$Q?HQhnm"0Z,V&b+h$rХ F/NG>Hj&Ņ|᪊=092XA-:omee$aH41Zˌp6 я^~DN&aMo"nPDanK/ڂ~VHZ0U * eNC?yxå[D+uݖw01Q`7&!"Wȱ˂P~Xf |xJ8t|_`<68i.lپ 4iQb* owu1=0e+AtĞݿ=<_BMUP@q8:Ӆ?ucyŌmL2Po5M󝈤(d&+-:ڼN xYݹ<.m)wtGmڃ[4) >lb',](;[a0Դ*Xtο4{b}xAS@!x{xsA7j/rwiAwr{ Vh&̱TkND!H+ПP a;F}ذ~=< B!1;Q&ر:+/u B +05‘Q8AYC}/] ֭G%\t&"=c9rw\s^Unbx-Ƴg6vdh`n9Mc9\.7"qZ*}|}Pq8!Г#.v),[9qwށcG9o:7)B69҉>po~,Yab0/v|2#?ã?DiprM 8u"eĂbk4i#l65[0htc=4.1QB~gn@T:-!jOw7L+6CU.C7fzzFj=ŋDŧAÌY0+Wr~wh:wYǗʄ;KKK/z5 :`1qA 48 C^o|]P>vNMc<'h ;vq}ɱ}o;b_D:ۘ+DV86EBm` 'u3Sx||/=O҈ABE$`wg.pQ܇&:pTL`*/#ۨ_6FAQ!y77Hmx;S7sPiyCo9ygOoMpmbis8*wTGfb6ҹZp8nl|&/#u:ynx7jH}n!D{vzݱdd'"4`4]TTUCygi%69)O壃cF]%GE9GQ {k]]}:p96[y*9ۋ-#0Ɲƿ ߼faġ,6A’ ,fd ɢ"hɈY )J%1GG'7X>m+6ş8YJY:Z*sKyz>^Bp"oE0"\*!f3zk`!d 91{\6E-[OY|~Y__۰o5-߸!>tbw/:z9O-K!(\( sJ)8pKL-2j)L  ,eY8rh/gL3u6mtk._vy{%BKW S(IRW*z sJ!_ ! [N[G J 굪?u*\'}}=N?<mۮtu_x<* b;{ѳhD!cBr&D>bRZIjݜ3ë!B y+89r RPM'q̄cݕɉgIl\4xТE}Ggv˶ٿ~ӈIǪ\-W\ya:r!\ tn .2Y|3`, #=gYو|6,K.6߰sV,w \K [sG\pp2UƔs! + 1p!g@3{88 @AQ(UH_3 9P^sgzul۶+] -^ޞ̧K81ia31%8,[,]pp03Bp90i[ )ɠkTDذqG#}~\Xn]]֧{RBBf0LcĊPn3ɲXY4ice"%@@ "rYtttȤ nCkYM,رCD[4:ݲO}hHG:z4!0"C!\C0gLSV3&8S,w(C # EtvuP J(4br*,xk3}ei ސe5..Clpe*qLYPə \s 8I$y.,%ðtuvR֝!9t``Mt +]8mkprL<Og",8c 3 `,1Z|Tå @GBqdfLfc @uLp躆rG7( +]4.20cɪUFyeݑdl``㟾|<݋bT BUs0 9EOBDh'Ǒ-: x?avm8_s؉ ?Ekc`'j*H)2ιB8S1PƔ% ,T#;MpbZg}l-k`"VKe4A)N j$,)bk6?0H5}ŏٷl8oGN) (TU;I_L4>&tQ@$EP݋wݒ&IZ$TiCt#qqQ ˖o1>2 M@5(?kTch&EZFGF. ?p9t0?}p1}l!>4MC u6pUA%7\y {Z.S* :!hzzʘj>sS8ǒE4쌭I_y.@C3aYCgEE :軞?vM7h4Mc~s_1һl54J[Vl>!WIҚPOv{.$nVQ؊\*$ZiT%}hYO$J!]iXߋ]>( %٤q 8,FiFn`TCDrwٳOkwwՙiJ0쬲Fr*%ICrgRhՕ߃AN'hs(2 " yT,~30L3-9KEϡ Eg:]|z5׼:+W^`x'!t-֖6*RĜ )$rcp&RJM]))i+b)M,@EZZ {_|^&9S X@x:J'1= ϊme۷o/ |QoE߼A4jsf%B'iLlΘJxYiJwʘ*yׄdۿ#y_~$Sg| СCgDڨfAuh3a9h͇Ay֔[+^zz_{ r--VR+I4mIt2։V7DFR$] Q}G" kcqژ8Vm] f4Sl/h^|a78>%Tid&s}nae~^ yNg3 J)w{.d(Z,e(E[IܩhYdvZ P$V")M$1 FH-Ht ` c;xqi)#YLR 1 ls_ jFyMsuTg$/U&@(Qn)E @[ǟ)HrUt9M%P)*9b:@BP \w 9tՠi%`C DX.aAuiQ"-u:'' L&8!l6yaaAիbeL&7hp,T.b+s-rt ̢ۚIm iٶэkW=*tCKV'd(BXòlNe²8 1MSp794qW82ٙiaXl"ޫO𜳔HRm.XJ%)Nm ODN 4űyp?Q.|0 h0BFZ(Lۆn0}id8":kKa7 D3WJec4-:zBUD5X&"$VSNe5gbz-i}V$Iq1 8@ p# C(,˄렄1( aY:A@`XLÀn0mnfl=w'FO])TfNR$΄`aI,l"u}сt̲E۵xYǶStalPȁZɓ0 T^PTEkׯIJO0i@HեC lZ3䚆iB3M(@ڶ} ښN 8)uBr R:Ӕ4#}vHEQ-j1aͲEl;ʥLӂeYШ@;?t  ֛paݳaH%# Bp.l9n`T&?ZöAu_=ہt,˺415#&ONB V6N6H$V )V3[gb,`8grKhuJE7c||_{Q̺K`AOկcnv|>m](Bm 7mщ*|N֛Ш=95yBY ;n X|O J ]i i؞i槴d"ԒHsr@0JM.]u0ΰtblp J|.>\]`ٶ@p0 6mX5nFTnc@bLKYH8Aho1L$N6rڈqJE{7ŁZ'GlZJql>%-б8YGZi0 MɕR` LV.ǧ`q۶L b1 oBl= &2:;lJg[nj6^4<2cded3iB hiEn''-agx6O(jrntÀ884M4@T*U8xr2;nc'ԓ?T .cykpwLl]2&g019YF6_Eii=D7/Z0@9*!@.phPUO4٫xUa)^SU21m쵷+Wkl mömMaH(Zn38f3?fXذz9/}7م s1@˖/q8fÿ Qך)+M={Lۆ˫`eH15 ~JϥxKCk׋l. 0UBcZQAd2iQ#}d <6Y= {^ؕ)T| 硯zp4gi0 n(ozBrVWvTʙZKf jm?eB*B*mu f-F[C+K xBj )A(M[UqxZG>#? ]ӡFu.cxZ#Smb.Y(t:+۶ի:htBR ־ |ap`99u|IQg* ☶3do-MWhM7B$%;;@JQ/)ܒ}mZզ: Ð"(2l|ׅz tWlO=a2S)B?@{z{r!D!3YJ>]!DZK& ZI{M[YХb_(1AZaQ ^|y|_U9q wʕi)E48J986ѓL}],Y]ܹLL)=qt]%%7iWpiҠw UFQ9De'՘1xlUA1q BpyR2><ҥ<3[נ'#ZЙ$ꞏ vD54aB31ļ%RF[29y`bܕƕ/11>4:>@Q a+J0P:`;gqƞ}P_z^BHI#@B>͘3sB@7t/Pn KZm e-$VSTTC!BQ5ɬDF=Eq΂_Ѓ))!/%t]4&~?JU=R ja0X#qMܿmǭcc$\A_k6KMѝl[or*a;N * j!ȒЗ~ ݶkJ5 h.2,|?@JQ(Q-WX9-sv+_[?TX#x.2AeafQ²-PPBPT!P*sGyfv099r$-IDATl!1 |ް,  B62ʏ6(Z$q M:%DvaFҶwQbJ@@TcdžNm 4icx,k5{!`h.FBFR*ިò,>v`Ep\n\ò,= Nj*f1sDm9DvEU֍6c8B.gyl:O59p 0=9fZZ FSu W/B|;A6\j#|4Mp.p(t"kDg 6 #cc8z\߃{86:ٹ{W]} _7r;`ud\Gű#=NEu44T84˲)iqI:)JՖ*dK@ELx!PBg݅0x( 3R`woXG7aX&%#4]a77mA>[ b1 84A0.^ ˶pם?426&DQe˗_@^Ì>;NmzAi$5SJF)LtYisBAX.64iR$#_!CY%TnG><l='w,\ P*fqı#0 Ti9bz śrJ L4%IQE^ob~Rʅ ,DP@>E@y/\BjY'+O B:>??[v062ˆfE!f_)Hk~ B_.`V.[ՍJOO?'^xɏUϸkpıc?*edrԫ3-RTxHYjz Ue %Z:iZoRڏj5 xn/xkn~#,@ʍFQW A!AW]YjcEƫvl _ >/ʿD6eK `ضcwFY?[?Їa:NS2(5F5ʼnKiS*RG 8\uۃO| aۖA!@p\E+p oDw*2(+Up=(đQT7)X"㕯#Gprrݝ21R액82| cYu0#?=~]+|*]7f3sS*%œ]i{J2AE"U$كIf@q͎z+|_i0MKn W l4ƍoˇ#QM:Cǎbxl Qb Xl b>9FL6Z~ضj89="l'(Q?^vŕrn#0l&)40Rz:HȧB]MN%luz{`:bu},M382< a*=.2{pAͷ]]ғc91+ρiE8t#?~tƦ7%Ͳw!nIȭWSO;0Е\&5F 1qo/Q* %-C9qϽi}Je蚦2կ <0zAlz{{P.0]] \} AtVY3}fnjvCkr R ~ȕP酦NΉQ3iڕ>Gd3X|tq1r(w[ FeI&x5=x0 ݍkoz#֞{>( La|r {ɓCPBǨ __ Wbr%gp xn'oF&Q3j!~ hG\m6lݤd7;+ϗBLfe3 A&_ˁ4\p(B? K .Ba_2[HG se> lp v\s-J](N58Rkس;Etph):eo +_r|8pn635mY|tvv"C|ߋso|G jgE_q<B@ ʥ2)]$Sc5T1*d,[[.܂+.{zq |/ƒffg8L˒努)YC  Cd2^{uؼr5<b/ߏ;wbVCgGJ. ,Z xB(?qfv5G76|;{?pɶmؽo/=ŋ84]O|%O=)S=]V^ZT㡞҃Yd¶q2tQ,gA-@P@OO'0`<SO<{_\ 2 D Y߇p]T0\~qkPt}5#b SSSؿo&E,?P(J&-]jd af} I^K1t9^|1 arzO<k>ñ3| _Í_8U7 CAH&Gҍl6TQtr9ds9dR38zh&N! AhM(,ga"x(æ Ln h;1hFC+%d ݔtj8o/pϗ>p2lڴ ibnɓw?7 M_I>fÇ+KL3YcZ64]S;aڰGp"rw|E\;u59 e,FFr3Ms}p\zq[nus::ff8r8߻G:tTg5]xaJSVDcӲ-qx;M[kxчntvvc`p\3 ˉ?1Bxsz{~U$;xKGqV Mig^m65lKF@iMbNhpKN-B5 #DQ ^m#ο+i:(895}aC<S''=a;,ٸq[:,vs5d?iX萒{Ǐ#75#]n=͟wpM˿p:D(Hҩ 2$9 A5ݒz|ܾ4_l6<(.|WbW7jhb #+䈂l&3 J*uU 3V)1@g' Pz {?yӼ}Hg3p({`XcoLaMgq0v Ňk* }߃=W 7X-%S B\\Udv 5 V=mHSh}p͚@.|Ӟ/%ƻ\/45=_)yAqe lT c,Y.3dZ2VرL-)'X 0,; L/Z_YO>e+Vn!CVA%2Y@k_c N V&f08h8欯㑟d/}2p _(,qᅿZ5^Ѣ͢ CL#Sw:OTJŘ& Т”bw\0FHi֎瞫:+LV766ZY#U_Wg2XPAQ%HAx0Tۨ.2(:_,ZOw$ojjZlU$SPb%fї!n'9¯Q48aKAD|Dz108U`R>_h$pz&]j\)ϊ.b +W'"/vL z/ntFn*ɕ ={>с2Ļk3X!âdsLCFς: V*'/:NeN$C,3EQGkjSUpvm+"=dʪu׀yYDf`G[>#0R#sJBZ *|:I2"PT3XGdQ!YF7$1 V㮂"թ:=yϕL{VqNeyO Q,ʢ;j<fͤ҈fr{t1&`5~S^~ { n!7|s}:l8{ޚHfIdyΙaҌT3zbEh 'kqX{%ALU&_`xPiրr @7yδJm@g Id^ =qL/4QFW͟vD$vVFHx6L';:܉+W4Ylz FE$Ѱ΢Ռg?kb7@kj:VP9s6z{N~_D_X2}`f:W^޴z_:?,G ́LVlz ߌ>Yfx3G4UjJ~ux}NjX^47by{.Z:p0?lٲW~kV,AE8W:z–(,Ec|ΑH ୷E(,0s6db$"wڅ 'Хډkk`h ՟:׍̛;6ʬ0mYiΕ8RFFFN"-K E?IsbmgeP_)4fz\;W G#ۻIprDe9& 6VB?l,m6FFY&-#HtX4 o;&d2ڰ"^$g u3Q_]y?y2ɂk"]8]ʾK?',xǜP4h.7ʄ 1ؘMF>iQ06a4.^d";q"DaA-Yo 1bJ6|/~&>:^dq宍FVMNwj2Rt S=&8d nut\FUMuSiI'IiIad%G  fn:E2!npÔ_x=ga5s_BD#<#fH(D10؁0M<3\]Ns2AN~ mVE$(ꦂjsgϢO J(E49 N="9QR6&=4<|> :W^I{U5l^Hpr2ٜ"aVłx:&4 W3Rb/rD\e:,{wi<@ՋlM(w`V,x]t-8u8b>_ 8Yyl?-S5+<(JUQ{T q) $EP&꧕⽷pa9>]L))3F"a# g0qIè888l5>œoD Z" r3ŽuAV zPfQ žn :%*jRؾMtJᰊxYQu ݃pqg#df( N3NMUP;{z Ň#L,;?v]CDGڎbV؎@K߫*jp qi '(b &ql)PR*H HX &t¡{^d:h3ᠽs)a%vbӪ[ Ma pHYsu0u03rtIME 2ɓlbKGD`'IDATx}]e:M3ɤw I ,"`Y׵_wWwUXV]׵B N{dw7~ϰm##+)4㩿M߷n`lȗ,s jfe0n >ӗ6L3_U2*҈i* G۟nPgpeCe`,-aO)>Jq뿇W2}1=wF\!/>==>zPLd/l> pAn>?+Fp={,ۦ$eptV@bÏ> ͭ3e # g p$ _e"gBHdF,l µH4m|q"mY 9_%eC1JB>W,ڍb=s"?[UpW?ӿ_tîC8($zyw(x4 (w~784 04<ʀӦA8R97_ÑX H   h#',ܗo`5h>DF3M-Eܮ%3\/3G~zDq7ۻw/465A0lSds9ؾk̛=b8v$mx|¥gaI$UD础~$ p??m ,12cEIHq& +l}slp]cS_[Uz❟+.jQT'Lw~osk۪H8(F.bnj 2"2MPIXB&I@ MGhabl B47g# (>z i&G2X0\ں]6sD~-& :w/\6}:!t/mXmҞbQ%+ [t͖aSj˲@A5ixR504 ]' ;hgl! cȎyat oAeh_h!j:MM3.Zz…T Ntt¦_>GFa+0 |ءXR5,Uv_mplAaX0(4ACdyϔHNjw? C`LEm"@ F ,6+&3aֲ%oޟY:HܲhѢgΝ?g[[[" >;lf Q$HqBjdo 8ܠ)FQh4u-3FftqA >qvy/Q!Blj!&ع[_zSdzK[[[ٴs-\8<®acϠ%ն , U;&7l ,4JmvS0_$JoD %n i{|tm3{/ϖ*GPty5t) (.@8{7]q-dp+VU[P5o 57dgFصc/B6paHW7].'qt$Uc*m(Tz21(b;CmibPB&; ES-F!Q4!f b]Ri[[GR?gNW֜`ٕpX;xm S($_OW3W>˖/_~Smmm>ly0JϾ7?|1!+[ѥKdԷD; I(9 4K6=QpHynp% A""CG M#gvalh`C+3yO꽫W^ Mml>wQ8D18 Do⨝PҚZ(۰\AP]GAh0 b &3` a:&&0NdPN0CQZy  7_|m w3>}Zxqc6_54^XWc #oF'0>6WTI&)lk@Nx͑pRN\PK@)ɖŒZ0BA%n 8PĒ8%+^qRL2)9# @ARJ~fg\[ .^d_Ϝ9|t/|axݶrʿjhhey{΂x4[^{1`ӵhW4]R H.}eN+K00\XM3TdMk> !RKD)fnb"FeGhi͚g7喢?W]~f |E+WXE Lp,5-39ޞTy! ,)r[KutppúJuI qF 7`Y&EsCLdCPx\ 9na&p׮|,YlK J H\{ 7}vݰbٙUl~vCЃ*F%@UBQۨX* @RM擤KvCFz3*#l@킲D̘.mf8@_Rԑɗ<{ْ, áNEmێ5$g/cuqhtu`rגQ@[bSnç< .M=&\dٙ r%Q*`ph fp_-{a3w_ D_  mNUAE]+IPJ WZ۱nlj ؊,+isi mJk &ɘ!„g [v@ǒ1p\G bwÂyf̚,ݏ>c| 3暏R':\Yq`_/?TU 4i~"b A@|!Jz]/HZR Aԯ1JT.-3e}Xئj _ 10`dѶsgGhH4Z>: m VÂZu=^o5WoꫯLUUgZ$½=}5ujRiI"))m '^0|п9[ny Z.`d>fI7Ů\5Tr҆󳙑B՟L!fS^쀬RꃡQXlYٱc7 NA >Ⱥu&}N ϫ(/G~::&*Q<n %m/ly<8XC`$qWDů-;HeK l۪LK]]7S,J &3M SQ{i(o@l>88 =%Ys\yƨO<9眏͛7a]s/غy .h*+i;Dx@MjFR:PRHKŒ!%&Ū^s%Щ+Yꘂ9pܟ\\u#lXz`"3M4,;a$[W\|֭GZϼuFkp{V~(ATUOa]mDC۲.OJX!DQRn잷TR3XK5 Rǒ%)< Rr\Pbb"<Aw%kmCAv@WvמWSؓE*l>NZE)\ e xi נ9d :{aRY9J Ǐ؝[- `x_r%o[ḩzꥺ?޼]GbU~q6ܰ !-@ Kl,iA[Dl_K5ZK7e*,Ec1EchOie3A1&>HS@08; m! y 05񗏞˜?oݲeˮDښ`gO?޳U_0:=uJNuPDuKU>ݖ>wd6*c;&( pC"d;AtrIT)* %7Bwg_? ՛`)"+p ` Y|O3;h* ^&>sK|xs?|pW&W8RwR!ϡJD>}U~<֩b" 9nr,`([Qv-t  ,qC*l9ێ"gHdvLéPfEgMr ɱ9HlkPɩP:}Cx#G=g޹X}a'dV.V%:i P] 9ˉ jսv\A"XG@ouD[ r 0O\g@vbڏ'pO"z> H AUw>4?ϝ֮];o׿:=o>*JoRG}GYD+`j)j ajVQI$ODUxU^RFȒc0k4C32 -i[gEAg!OQ`TѮlHG|`}u? {iW/Z0/Cv|+l[jZpJ  YN񭒫>*jNG5\)rC'[rMwzʥcS ei-I7vrH'ى^1rq?%~lrЌ˒13T5^SjQdB*Qz|&p7SZ%t6l|xC>Bmy2T-ౝL$l7A4W Q&l7>n* :N;Ut($%G ,gM:xh)AroKe)QS)1g+!;!9i"Gg!`Iemtҹ޴i޶Ysomb-[@ ` p*_*n ;?]0h 7 s:sӃ"[t&Ƴ aHhA=ԭJjYMV}(%K><<X:o%*|f UYI6Q=ˉNֿ@T8]M廳z-ۮ"N) %72hOar[\NG3eݳ-@4# baȕT3 b29C,+KN巾-sέ /ݶm[GHxy>l^_:KdWײ5[v̡}s\EY-[#vzT2!epјL;砘p;sg@{g7> JUTQe Fsy(e3066B BwÆפ7&###Eoh{ UIp$pn%.y:`3h^'>*Ucу@&FF'K#]ʮk`BWt1qde Pk:u I[^@020 1?H09[ aUW^Hu]û:p\tPku=3- 7Ǫ@v̞rS!Մ->9h#lY(1< y5F̒[f'#q 33 @._:w"9Q@Cb*j*Kpɘ?XgN?$CDjҥ{i1Eގҟ3l|4Fٲd[U몦L]݂Ӿ-.jpI >,GDTĝ }>fWk#PЇ ,2cV9΀NؽefrP3QcH"DUd-d{RTW^^MMMPSSP=Ag{vw U1LD^{Ṭڷn큀i8#}̆  3+ 9F?H4\dɗ'Bư Jtƫk/ zd5tuFhD[;kְtjTWl zDq*fiTg/;8OOkb)}k7ʺ =aY<%` i}r$C|LRx Ga ji~`<6ݞpִfԊp6@.TRK΂% gCAν%!stɳu.Y<5)vB& p摹DK uN f^tu>Ȍ$$ӕp#Ic \͓: ߻;Eꝡbeҋ2mAs !+g+iT?YeO$Sի/DhFM lOXԔ{Hhl9~Ҟ݌m3ZރaNj~>;g3 Rϟ3 y 5uP<\!BoOO+#sЯ+Mat: 17: `= (UL ؓsaRܸjq|{4X^M!hb KHJуD|d|!BC G{x9+?Ie$RDQu<*aYP++y=P$f(([:٬ݽQU|4@KK]yU2z0{*Xv]^)1C*) 7e9uL1Z6UAi^=I>uѤL|"2]BDdVoJ .lHˏ<KCE:@Xq2@Q=VW%QX8}Y ht06:ˇc`L0hs񧵥|Ur(OOK&y|_íew$8DZ<#UiYe\/3GfO*OjX!OJI;1'k -\NS(wh '0\~5a@0O̙JkmcQH&bT[[[aZC4TUHe\bdoT,9?l[9m E"iP{ _2 0\UWIĕ}u/tz'xΠEv_xXLg :Ҿ N|O}2HpKд3Ip._^,Ug- A|}>؆c*O- A)E|WC4.'! bUUPj6 1z@0 P^^ކ\OI9E,iүZ}lnU˶ۺ5)W?8r C``ysB2w[=v? gPQ]rTd@3C0HҏDOE~06 {USe_t\rǔx <<_h ,N&?n>N2sT; 9,TMoF7|DI2i*hK8Zd*]j(Oy?Ploχ(߀Q&hʛ|;11"Ocl²\5`NvK##*mma fgO(u/TJ( W'¶BzATU(pS?Θ,:^NjzUC3<_O1 !W%j VͤxeƎ31}M,.rL̵xr}HD аpTv]sS.jݞMpz&3=4PM )z`hjIQKJuZƽ!U=?wC$`tJYw }upf7Cߕboy"Çt0wwƺ:#m"Dŏ1HՍ1uڒx{@ ZZh{9S@jVL.p3jГRL|٘1N3pCl)u[ Cme9tttO?!jVM6?_(_s?S`PYFd7E$7ot*/7.溷m|xܘlzm+Љ.K]wM>|OÇI ^nJDo3789kբj[TǂsL%gPL^jfgѥ#58 <58nk^~y;"B(?2 M#4-{WKMFS:0XQBѭ[ ju`Eի[}4Opg?f3CX}(4h*xqw8%ں?O\/@0k2S|5<;bjtL,|_$sZp'˕~%NҏC駥#grį<=x(ܱUzObNyioFh? ` QVr3,cc[O ,C RV|y|^VU .: v!4эw  :[n7  p&՟C"\:*{X/ҩ4#z#WoY9x%mܬZg@FGG<]bP HJ4 سs;'*INH?wf_GʺΗDa"QwjkjyH8Iti]tg/o&cM061'1@Xhx,^E700GuwY -jm'h On򊛚??`0xa9<;M֧b "r;_0']>z"'о$aN["bFD#&>ږFڏ¾iQ.y!AD r"K)si?яhV VTmd8LhGJ,ji{,;0첩S;F 'Bo6k$*cG2WJ@*tUN^hףKE~~p Ja^_U: ۷mqT?_ gۏ 5 z.eiIyJN $/|JttB0oGqBP' -_ޱ=x2(iIo m05D$M4:efOo?2 qW`N9L&wRZLKU滥NԷ'O$*PE59m<'Ї5V&`3yvkIrL>-+_0@P2(W9# $/)g?ZkW\V "FdaρS3@790(?tyM,Q;R4yCg Ջpvlhoh{t , [գלH0}/We,c}{=D)IߏĿK`%|͐߉Cpq }Yl M-fԧczjO @qSTtfWV?VCLC&F#asڴiS3,Osb"HUY*U٦aݖ([[ClbkղؚNvz=e՚gg]Gb*\\STMc/m;?tw1OO@Fk)}C}=lxh#l~qwg#%175"rWwר8؋z0H{ BL0؀V۾k_| r}X7n8i)(A|IqG3"!%#Rk&+cp.w0Nvm1ijM^dܰI>3uy*$ ?Z-EeqUh\xWv]0*@y|@-*\FLF(~<+1_ St㶣h:<1xoG-T0޺h@ * i Nxu*9QF#!F**iޑb ȥuzA3eZ*_g<~vЦhć65i1ZeQIGio)X`KaϮpO :ϫq8VG: *gBIA73|[߄nf¹/>g9ryvӜJBP$B>.J^U64,:3a/xaL\SfdD-qb~, ^(%dF?JxĎAjT+.v{ y]>&~61Z#ODxB9'๸W&3YJ|:C֗aThtEy<@f >l`  7MEܶ=t+IhЂ6e$0KTzXEoT_BYI5`h+bxY; {rlwK^J+X"Zdcg!DV*W)^w$<59y"\n,=k)DDF$&j] X3k.OK`Snkr<ЃzzEڥ![.ڧbT 1Du9rafʅ'#4Ӥ0DZϽPt2C{ dP˲TJ&:gQE/+Hb> d+LdtOHu"0F,Πqڼjfo'6#D?Oъ_m+v?N~lJhp57q'*0gMM{#N5z20b$2m/5W\{w3g|O&p ~ht$W3^@ O|7m{0Lo1 5p֋J`T lM";l͛cM$X݊.|cLv0"l͟p&D||<ů<UG"C u-ӹM&}+R(Q(2w^97-#Cud>,ʊ49v5䖙sPn8({GPHsS sJAi~gͭt鹫fߺ&C iL7pR6kW!mڔ‹[ُC&=ގeao EG[}|E|`Cz;iɾ2/bXf5Hx_y*4PؗjSeepqh>C¹X;#.Rg_T>\5P4k:<.f!Y}utt#eP1S^87US㪦eBD}z wI,{R> C3 ^`TF8n0@綰}&4F.2Q.3,C#tD@k|-*/<©JH&,1zK'{W]^" M$h8n=o{\C#9I?g}hCGBBϢЎ ;;;?ݸ~#lvzs WDDoI[%8)g,D(ZM:/`&:ANRL!>DIg܀'zxYKV-Xg1ċҥ<%'¥Q=CCe G x9TV0PqdIS65?ALiF9cp%2;!<  too4Hk&9%@04\m_g; "d0(4l\1U@nGst-COԸM-`8Q>)A+i)g;I{9FhK/3[$8s220Y|@˜L8C4'H$|CCCjɱ,% e npG_/aiӬ;@?߱z;کdDcrES2@.3q":5rWMg+wMx|}ƎJxFܺ0Vpdؒ%uLumM *e.Xʋ`iApw ބpS ~vB7]g,;wFrpQ/μhns736H$ʠ ~,KL`[.؟~8+SeILmF-Gf/VVN)e(T~<+7 PFφ9@۠# 675-{֤]$m{Z%=q$(}i7$oIRWq5We/i( P)"{0Rűh =`]p"WQ, $wIAT}t;+/(46OGf+(уO&pkOgG=DJ2T557=d 7-=+Eqa.LQ s60|&!X6p:>`iLkHIEyXU?9gVm AFӇA6TfK6DyuU5 ~U'~<~2!dsoG1 ;v??~; Q?9lz^'Vv"ۋ™zz3Ht:)KК@`a?.8WS4M)4 6&1AM}YFv_.Z 9cW0Aw͛Śjo| U|rT5 ^utgE0/ T"X3iZ*#?/~l i^O> U)لJYg,8zW2 ű=ECA~a{GG-HyTT _SAuh+{ |`C.fTI A,~.<5XFkm!vD(Y @-U'?nXq_r\^ME|K@ enI1%`i!hN=J$׏MǤ2. Bxdo_W]ː?Oϛ\v)W P:#Gy=/²χYsgBgOi?v?ϼ'6 ]*A]C ‘S BIc`l-ji8fJJkٲ'T "` GYm 5088 ~?bwQas)A1!]瑥-|st_-STeCKs#9YbI(W]{-{~lt8$7!8D 8<<vؿ{nx9txx`Hޗ` QeOgL X9sU=@ڇZKv[K.P.R^b8cS 1m\h4mdJGt*o81aN y?շA`W_S͡tn,ɨ[^);`QXԓ7\/oxK7@3a(g?EsPozw:0:KobvE T]@$J:x(0bLD"VL9M$jmbīylOt y Y6@"鉡/H`worAT=p/~>9xYM2= HO';{`R45(=/ 3`$DH>mDijghjh%jb ;["gJHDФ97 6Ħghi4NVڻcҗ,5~ء/66G01>B3 r=AW,k[ _C. &iH#[ݯnTpTebݒp3i(IX+8`b4>/=4t?Tյ5g/^о{TDԓUL(•Sy}"] _iDϓ_!8A"O^1f>0|^+إsO )- B"626'{Ts}[o9xB0zvxlDhӐ!!(iN)6L-^m 8$l)Y4g7,Aȓ1p{Syr(`0- ˗/`vyn ۷QTϩwӱYƅD+/Yg,Z%ϕFbR≈[* >/qt]ѯ~+#0́Z,=QWMuMo ;^5 |DӒ;;jJk`C]H[Pi^٣>ǐ ;ae{(Ha%0JѼDi4zvH/ע mHPCPa֗~O?k.Zcⶵ;!(@0 eU\7w;75L>Wu҂emVP^B֜yD<eH9$bpT j>o:cOРvݻv#tt} WyyghA?W&XpRF"-'L& "E`@-D kxTQD2bv"?]/WᦷãUr͍%Gc{n8LD'@H ClJ{z>S?~Wan<~n}c3`Rt2n^`K5d6k䄏=Sb#Vi"=5gB^j!:.[r=,;W{ 8qQ~˭e>x^re:a[Y0o\~[aZ,e6&\`j )fQgO?~dHimKI`[O}p\O@ЃL?wgm`Ό6.P J+iGrTb;}gh)3@247>zQWDZUhF42(" CftUu'HrGLnw1C'&DDt#(4 ]dC_j%ţ O<pm+K&YZ{gTg n~}_8.Fhkp0~ <[TA 34:ʄ?r8f$fIbr >_|_wShijg3mB>Ntvr+=xwv'?ck9JdIqwhm/ѣקl=D<8ڻ}=f",G&˂YBa|( IOQY9I 9CfQmQb uMϟ[_*w{iO0jD n+ƠkW 4ba8yp暵x_̐*a7@w04{RbY?4L@*p߾U1g.SR)C k.?3ú58ɣd2\9?s "c/_|M|ï*3_%ƖNSUh'"9 F{QMgP -`س0FC1DS+CHqFǞ.H.&>D޴+W $) s}]0O,$?p^h9/}}w>P?@78 2ihk3>ȽP߫-9뀪&,|J)ȕk|qtb2c }6ܮ}۶3`޼pYg@SS=3|/oeΛNIS=w/[ V]q 節.i)SO6"F3ԵM \Sq@F^q/=w yyhhn~3=o'0kt]t 4c<U+lxK0zMc#qdwOoR?|P#geƇ>+bhLJ1!Z" IaXUD&W~z;Kġ<] Lm=33Nxqs'JM9HjݖhUsr33wx 5p[ni0XI`JcrNJ>t A:3YX69d:؜ B?~?&>.AL?wCzdbzǼX+Rix 9sf>p]O~¶6~:}0â oQ !U~`aFEh#Qni&ULċT(jG%`p/`Bm 2e\Fb>Cqg 6۫y/B&e+/@<1Oz咳Weg=B9Ҏ`ڋɖsHGg7{93pw׏7Ctg̙sJoO l^"b0 ;L{[ZOͣ&y$zrXHr-|_yy "31ABBЁxx`1 b\4U77'MK6 6xO&}g0,;g;aK`W;xgμyκd8xAsUz`a̛Ȏ =w430d 0%<AkueoO*[\0vV6N* wpTw2`sQX4DKW'?υU> GH9~(P$Vw?woOk.\xEƲYa* VY3 q7{̞/^aoΎGu#QQEz t=U Ͻ;ъ PUS[:qa JCuKڨVk:@ߐ"U?HD)ف9dm?Uء{&~kr%]/ /!Yܩ8Ci|l<ģUHѝS@o{>3w'O?!2*8u,fՍMKPHxb|fu/ldU^ΣF} q cp`nؽ% U]W_JR=;_x}{P_׈$pQ}A;'5ư'WfW~a^Ȇ>-J2aXorZPFO㇧D[ZL,\pQ,:5w6eWWUXc@;4$l=Nu6m~' S!d/g荋8i3fLUTTXF7OإL=۶VkVb@PQ'bO4)vyEe.z=3"?:+&(WNƵׄLmosalO{(tws(u 8m>]$SkwCXlGRڨ.OaYpޚm6%vHd&=#_xaFGRkĀv>M^N+KfΚ\.L0>e?<3 rHFٳ#H)2#;xС}RlOmM"dQc$RLPжP"W"P0p>j".YvX;0<HzWq BMu4h (  抱a%$x޽ݝQ<|hRdOp)fkxf )OTFѣ"q+@_ǏH@=5DdQyQyya,gl2A7J5Gq9,!(Hl Ci|( H6= BT! Bo9&C(!t(!1ڈK6`hsyb0w2m1°W*;AאT[poI6I6]©AZ g[IXyBD˦GF=DAlb"Q,OCaVAi ?v*LB+!$7L+\L1^ڧsSA S`,8 I5peNz1䑀L`R½*6)l=yi! 0yN"*/е1T pSITnMAzl`<bcRdbNj)A+֩Tk.:,kIENDB`./decibel-audio-player-1.06/pix/audioscrobbler.png0000644000175000017500000000234111456551413022271 0ustar ingelresingelresPNG  IHDR cI3PLTEZWXǑ1-.?;Ϙa:PL>ّGlwN+w|6twwòIDkk+zzz&|Fo߾9aXxݶ pԗs( H`f$ rID"H$XW[[;gKg r徫h` _wu-pߧ (kpR\Wh:jAc bࡑ@נubEbH H,"Q 0ȧ`Yw`O4&3?̅nH ᓷwma1G8we҈bz&bXD^xv5RٙK PY}iO/7<?y 7 I.K|2t&/ā]0!2D!H)K("'=&031K !6PHHIzi,fmۮ~`YZ(|٣P0Bb}$^nJ鑯C1nFNFmT_((!l "~k! fNJU\( l\:uG~8eF'v e9Eꑞm \oLyMxPg"ʓFY3w%MH6Ԫ,GNɥUOt4y3e0n@zkd6sؿsô?W<+ժ`U()%t_A/]jM9 H@ :/tɜQ2s 3,[ dTGNea02.2u SQ u fc 0&٨eqN [7v3JVxA :70.L5} VO, 3QTQ‰Cfn]ku {9b!D+/-ͧ0V)_!(UC],[z!0B" U2Jʇ9`d>,~:oFs >oax&musSU=hiISX `Zyh.2D `2j'{jA*okQv4k@%s+s?$g1K\z8NHg L4d(3%C^ɏhڀsx۸ΜIiaq^0@ (VO߹թ.]S&6[C+Ye#cf-7P]}NP 0"3+w|L(2c7C %='9J)(l7Z $VPȪ֘5#oYXIENDB`./decibel-audio-player-1.06/Makefile0000644000175000017500000000575211456551414017436 0ustar ingelresingelresINSTALL ?= install MAKE ?= make RM ?= rm RMDIR ?= rmdir prefix ?= /usr/local PREFIX = $(DESTDIR)$(prefix) BINDIR = $(PREFIX)/bin MANDIR = $(PREFIX)/share/man/man1 DATADIR = $(PREFIX)/share/decibel-audio-player SRCDIR = $(DATADIR)/src PIXDIR = $(DATADIR)/pix RESDIR = $(DATADIR)/res APPDIR = $(PREFIX)/share/applications ICONDIR = $(PREFIX)/share/pixmaps LOCALEDIR = $(PREFIX)/share/locale CONFIGURE_IN = sed -e 's!prefix!$(prefix)!g' LANGUAGES = `find locale/ -maxdepth 1 -mindepth 1 -type d -printf "%f "` help: @echo Usage: @echo "make - not used" @echo "make clean - removes temporary data" @echo "make install - installs data" @echo "make uninstall - uninstalls data" @echo "make help - prints this help" @echo install: cat start.sh | $(CONFIGURE_IN) > decibel-audio-player; cat start-remote.sh | $(CONFIGURE_IN) > decibel-audio-player-remote; echo $(PREFIX) $(INSTALL) -m 755 -d $(BINDIR) $(MANDIR) $(DATADIR) $(SRCDIR) $(RESDIR) $(APPDIR) $(PIXDIR) $(ICONDIR) $(INSTALL) -m 755 -d $(SRCDIR)/gui $(INSTALL) -m 755 -d $(SRCDIR)/media $(INSTALL) -m 755 -d $(SRCDIR)/media/format $(INSTALL) -m 755 -d $(SRCDIR)/media/track $(INSTALL) -m 755 -d $(SRCDIR)/tools $(INSTALL) -m 755 -d $(SRCDIR)/modules $(INSTALL) -m 644 src/*.py $(SRCDIR) $(INSTALL) -m 644 src/gui/*.py $(SRCDIR)/gui $(INSTALL) -m 644 src/tools/*.py $(SRCDIR)/tools $(INSTALL) -m 644 src/media/*.py $(SRCDIR)/media $(INSTALL) -m 644 src/media/track/*.py $(SRCDIR)/media/track $(INSTALL) -m 644 src/media/format/*.py $(SRCDIR)/media/format $(INSTALL) -m 644 src/modules/*.py $(SRCDIR)/modules $(INSTALL) -m 644 res/*.glade $(RESDIR) $(INSTALL) -m 644 doc/decibel-audio-player.1 $(MANDIR) $(INSTALL) -m 644 doc/decibel-audio-player-remote.1 $(MANDIR) $(INSTALL) -m 644 pix/*.png $(PIXDIR) $(INSTALL) -m 644 pix/decibel-audio-player.png $(ICONDIR) $(INSTALL) -m 644 res/decibel-audio-player.desktop $(APPDIR) if test -L $(BINDIR)/decibel-audio-player; then ${RM} $(BINDIR)/decibel-audio-player; fi $(INSTALL) -m 755 decibel-audio-player $(BINDIR) if test -L $(BINDIR)/decibel-audio-player-remote; then ${RM} $(BINDIR)/decibel-audio-player-remote; fi $(INSTALL) -m 755 decibel-audio-player-remote $(BINDIR) $(MAKE) -C po dist for lang in $(LANGUAGES); do \ ${INSTALL} -m 755 -d $(LOCALEDIR)/$$lang/LC_MESSAGES;\ $(INSTALL) -m 644 locale/$$lang/LC_MESSAGES/decibel-audio-player.mo $(LOCALEDIR)/$$lang/LC_MESSAGES/; \ done uninstall: ${RM} $(BINDIR)/decibel-audio-player ${RM} $(BINDIR)/decibel-audio-player-remote ${RM} $(APPDIR)/decibel-audio-player.desktop ${RM} $(MANDIR)/decibel-audio-player.1 ${RM} $(MANDIR)/decibel-audio-player-remote.1 ${RM} $(ICONDIR)/decibel-audio-player.png ${RM} -rf $(DATADIR) $(RMDIR) --ignore-fail-on-non-empty $(BINDIR) $(MANDIR) $(APPDIR) for lang in $(LANGUAGES); do \ ${RM} $(LOCALEDIR)/$$lang/LC_MESSAGES/decibel-audio-player.mo; \ done clean: $(MAKE) -C po clean ${RM} src/*.py[co] res/*~ res/*.bak ${RM} decibel-audio-player decibel-audio-player-remote .PHONY: help clean install ./decibel-audio-player-1.06/res/0000755000175000017500000000000011456551414016556 5ustar ingelresingelres./decibel-audio-player-1.06/res/SelectPath.glade0000644000175000017500000001016211456551414021610 0ustar ingelresingelres 5 center-on-parent dialog False 6 6 18 6 12 Name: False 0 0 Path: False 0 1 False 0 12 True 0 12 True 0 gtk-open True True True False False 0 1 1 1 0 False 1 1 end gtk-cancel -6 True True True False False 0 gtk-ok -5 True True True False False 1 False end 0 ./decibel-audio-player-1.06/res/Covers.glade0000644000175000017500000001540411456551414021021 0ustar ingelresingelres center 12 18 18 0 none 6 12 6 6 6 Filenames: False 0 True Filenames to look for (e.g., folder, cover) 1 0 Search in parent directories as well True True False True 1 0 <b>User Covers</b> True label_item False 0 0 none 6 12 Download covers True False Try to download covers from the Internet True 0 True 12 Always prefer user covers True False Don't download covers when there is a user one True 0 True end True gtk-missing-image False False end 0 False False 1 1 <b>Internet Covers</b> True label_item False 1 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/StatusFile.glade0000644000175000017500000001114211456551414021636 0ustar ingelresingelres center 12 18 18 0 none 6 12 6 True 0 gtk-open True True True False 1 <b>File</b> True label_item False 0 0 none 6 12 True automatic automatic in True <b>Playing Status</b> True label_item 1 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/decibel-audio-player.desktop0000644000175000017500000000165411456551414024137 0ustar ingelresingelres[Desktop Entry] Name=Decibel Audio Player Exec=decibel-audio-player Terminal=false Type=Application Icon=decibel-audio-player StartupNotify=true GenericName=Audio Player GenericName[fr]=Lecteur audio GenericName[de]=Musikwiedergabe GenericName[nn]=Musikkavspelar GenericName[no]=Musikkavspille Comment=A simple audio player Comment[fr]=Un lecteur audio simple d'utilisation Comment[de]=Ein einfacher Audio Player Comment[nn]=Ein enkel ljudavspelar Comment[no]=En enkel lydavspiller Categories=AudioVideo;Audio;Player;GTK; MimeType=audio/musepack;application/musepack;application/x-ape;audio/ape;audio/x-ape;audio/x-musepack;application/x-musepack;audio/x-mp3;application/x-id3;audio/mpeg;audio/x-mpeg;audio/x-mpeg-3;audio/mpeg3;audio/mp3;audio/x-m4a;audio/mpc;audio/x-mpc;audio/mp;audio/x-mp;application/ogg;application/x-ogg;audio/vorbis;audio/x-vorbis;audio/ogg;audio/x-ogg;audio/x-flac;application/x-flac;audio/flac;inode/directory; ./decibel-audio-player-1.06/res/AudioCD.glade0000644000175000017500000001574211456551414021035 0ustar ingelresingelres center 12 18 18 0 none 6 12 6 Download disc information True False Download disc information from an online database True 0 Save information in a local cache True False Save disc information on your hard drive True 1 True True Remove all disc information from your hard drive gtk-clear 0 Clear cache 1 False False 0 2 <b>CDDB</b> True label_item False 0 0 none 6 12 6 6 CD-ROM device: False 0 True Location of your CD-ROM device 1 0 True 6 True CD-ROM read speed: False 0 True 1 1 <b>Miscellaneous</b> True label_item False 1 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/Twitter.glade0000644000175000017500000000760111456551414021222 0ustar ingelresingelres center 12 18 12 235 18 0 none 6 12 6 6 Message: False 0 True 1 0 <b>Status</b> True label_item False False 0 0 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/HelpDlg.glade0000644000175000017500000000346111456551414021077 0ustar ingelresingelres 425 350 5 center-on-parent dialog False 2 True automatic automatic in True False word False 1 end gtk-ok -5 True True True False False 0 False end 0 ./decibel-audio-player-1.06/res/MainWindow.glade0000644000175000017500000004301411456551414021632 0ustar ingelresingelres Decibel Audio Player center _File True gtk-quit Quit the application True True _Edit True gtk-preferences Display preferences True True True _View True True True Full True True True Playlist True True menu-mode-full True Mini True True menu-mode-full _Help True Online _Help Open the online help web page True False True gtk-help gtk-about Display about dialog box True True False False 0 True 1 12 12 True False False 0 0 0 0 Select an explorer False False 0 False 1 False False 12 12 True 12 True 2 0 none True True False 114 107 True ../pix/cover-none.png False False 0 True True True <span size="larger"><b>Decibel Audio Player</b></span> True False 0 False False 9 0 True True ...And Music For All False False 0 False 1 12 6 False True True True Play the previous track gtk-media-previous 0 False True True True Stop the current track gtk-media-stop 1 False True True True Play the first track of the playlist gtk-media-play 2 False True True True Play the next track gtk-media-next 3 False 0 6 True True Elapsed time right False 0 True True True Seek a position in the current track discontinuous 0 0 100 5 0 0 False 1 True True Remaining time right False 2 1 True True none True False vertical audio-volume-muted audio-volume-high audio-volume-low audio-volume-medium False 2 False 12 2 1 False 0 True automatic automatic in 1 True spread True True True Shuffle the playlist gtk-missing-image 0 Shuffle 1 False False 0 True True True Play all tracks endlessly gtk-missing-image 0 Repeat 1 False False 1 True True True Clear the playlist gtk-clear 0 Clear 1 False False 2 False 2 True False 1 True True False 2 0 True True True False 6 0 False 0 True True False 0 True True False 6 0 1 1 1 False False 2 ./decibel-audio-player-1.06/res/FileExplorer.glade0000644000175000017500000001624611456551414022165 0ustar ingelresingelres center 12 18 18 0 none 6 12 12 True automatic automatic in 0 spread gtk-add True True Add a new root folder to the file explorer True False False 0 True True Rename the selected root folder gtk-edit 0 Rename 1 False False 1 gtk-remove True True Remove the selected root folders True False False 2 False 1 <b>Root Folders</b> True label_item 0 0 none 6 12 True Show hidden files True False True Whether hidden files should be shown in the file explorer True 0 Add files to playlist by filename True False True Whether files should be added to the playlist by their name rather than by their tags True 1 <b>Miscellaneous</b> True label_item False 1 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/Progress.glade0000644000175000017500000000527511456551414021371 0ustar ingelresingelres 5 center-on-parent dialog False 6 6 18 6 label False 0 0 label False 0 6 1 0.019999999552965164 2 False 0 3 0 1 end gtk-cancel True True True False False 0 False end 0 ./decibel-audio-player-1.06/res/StatusIconMenu.glade0000644000175000017500000000440611456551414022501 0ustar ingelresingelres gtk-media-play Play/Unpause True True gtk-media-pause Pause the current track True True gtk-media-stop Stop the current track True True gtk-media-previous Play the previous track True True gtk-media-next Play the next track True True gtk-preferences Display preferences True True gtk-quit Quit the application True True ./decibel-audio-player-1.06/res/Library.glade0000644000175000017500000001350411456551414021163 0ustar ingelresingelres center 12 18 18 0 none 6 12 12 True automatic automatic in 0 spread gtk-add True True Add a new library True False False 0 True True Rename the selected library gtk-edit 0 Rename 1 False False 1 gtk-remove True True Remove the selected libraries True False False 2 gtk-refresh True True Update the selected library by rescanning the disk True False False 3 False 1 <b>Libraries</b> True label_item 0 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/Preferences.glade0000644000175000017500000000652511456551414022025 0ustar ingelresingelres center 12 12 True 12 True True never automatic in True True 1 0 False 0 True True automatic automatic in 1 0 start gtk-help True True True False False 0 False False 0 12 end gtk-preferences True True True False False 0 gtk-close True True True False False 1 1 False 1 ./decibel-audio-player-1.06/res/DesktopNotification.glade0000644000175000017500000001426511456551414023544 0ustar ingelresingelres center 12 18 18 0 none 6 12 True <b>Title</b> True label_item False 0 0 none 6 12 True automatic automatic in True <b>Body</b> True label_item 1 0 none 6 12 6 Show a "skip track" button True False True 0 6 Notification timeout: False 0 True Time during which the notification is displayed 1 1 60 1 0 0 True 1 seconds False 2 1 <b>Miscellaneous</b> True label_item False 2 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/Equalizer.glade0000644000175000017500000003546011456551414021525 0ustar ingelresingelres center 12 18 True 18 True True 12 True True 6 True True 0 -24 22 1 10 10 True 0 True <b>29 Hz</b> True False 1 0 True 6 True True 0 -24 22 1 10 10 True 0 True <b>59 Hz</b> True False 1 1 True 6 True True 0 -24 22 1 10 10 True 0 True <b>119 Hz</b> True False 1 2 True 6 True True 0 -24 22 1 10 10 True 0 True <b>227 Hz</b> True False 1 3 True 6 True True 0 -24 22 1 10 10 True 0 True <b>474 Hz</b> True False 1 4 True 6 True True 0 -24 22 1 10 10 True 0 True <b>947 Hz</b> True False 1 5 True 6 True True 0 -24 22 1 10 10 True 0 True <b>1.9 kHz</b> True False 1 6 True 6 True True 0 -24 22 1 10 10 True 0 True <b>3.8 kHz</b> True False 1 7 True 6 True True 0 -24 22 1 10 10 True 0 True <b>7.5 kHz</b> True False 1 8 True 6 True True 0 -24 22 1 10 10 True 0 True <b>15 kHz</b> True False 1 9 0 True True False 0 True True <b>+12 dB</b> True False end 0 False 1 True True 0 True True <b>0 dB</b> True False end 0 False 1 True 2 True 3 2 True True <b>-24 dB</b> True False False end 0 False 3 True False 3 4 False 1 0 0 False 1 6 True 12 start gtk-save True True True True False False 0 gtk-open True True True True False False 1 0 True 6 True Preset: False 0 True 1 1 True end gtk-close True True True True False False 0 2 False 2 ./decibel-audio-player-1.06/res/IMStatus.glade0000644000175000017500000001745211456551414021276 0ustar ingelresingelres center 12 18 12 235 18 0 none 6 12 6 6 Message: False 0 True 1 0 Update when paused True False Update your status on pause/unpause events True 1 Update even if not available True False Update your status even if you are marked as unavailable True 2 <b>Status</b> True label_item False False 0 0 none 6 12 6 Do nothing True False True True 0 6 Set status to: True False True True rad-stopDoNothing False 0 True 1 1 <b>When Stopping or Quitting</b> True label_item False 1 False 0 0 none 6 12 True automatic automatic in True <b>Sanitized Words</b> True label_item 1 0 False 1 6 gtk-help True True True False False 0 False 0 12 end gtk-cancel True True True False False 0 gtk-ok True True True False False 1 1 False 2 ./decibel-audio-player-1.06/res/Authentication.glade0000644000175000017500000001377311456551414022546 0ustar ingelresingelres 5 center-on-parent dialog False 2 12 18 18 gtk-dialog-authentication 6 False 0 False 0 12 6 Password required True False 0 False False 0 label True False 0 False 1 2 2 12 6 True False 1 2 1 2 True 1 2 Password: False 0 1 2 GTK_FILL Username: False 0 GTK_FILL False 2 Remember this password True False True 0 False False 3 1 1 end gtk-help -11 True True True False False 0 gtk-cancel -6 True True True False False 1 gtk-ok -5 True True True False False 2 False end 0 ./decibel-audio-player-1.06/start-remote.sh0000755000175000017500000000152211456551414020752 0ustar ingelresingelres#!/usr/bin/env sh # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA python prefix/share/decibel-audio-player/src/remote.py "$@" ./decibel-audio-player-1.06/start.sh0000755000175000017500000000154211456551414017463 0ustar ingelresingelres#!/usr/bin/env sh # Author: Ingelrest François (Francois.Ingelrest@gmail.com) # # 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 Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA python prefix/share/decibel-audio-player/src/decibel-audio-player.py "$@" & ./decibel-audio-player-1.06/doc/0000755000175000017500000000000011456551414016532 5ustar ingelresingelres./decibel-audio-player-1.06/doc/decibel-audio-player-remote.10000644000175000017500000000203211456551414024062 0ustar ingelresingelres.TH DECIBEL-AUDIO-PLAYER-REMOTE "1" "January 10th 2008" "User Commands" .SH NAME decibel-audio-player-remote \- Control Decibel Audio Player remotely .SH SYNOPSIS .B Usage: decibel-audio-player-remote command [arg1 arg2...] .SH DESCRIPTION \fBdecibel-audio-player-remote\fP allows you to control Decibel Audio Player using DBus. .SH OPTIONS .TP \fBnext\fR Jump to the next track. .TP \fBpause\fR Pause or continue playing the current track. .TP \fBpl\-add file1 file2...\fR Append the given files to the playlist. .TP \fBpl\-clr\fR Clear the playlist. .TP \fBpl\-set file1 file2...\fR Set the playlist to the given files. .TP \fBplay\fR Start playing the current track. .TP \fBprev\fR Jump to the previous track. .TP \fBshuffle\fR Shuffle the playlist. .TP \fBstop\fR Stop playback. .TP \fBvolume value\fR Change volume to value (0 -- 100). .SH "SEE ALSO" .B decibel-audio-player(1) .SH AUTHOR Decibel Audio Player was written by François Ingelrest This manual page was written by Emilio Pozuelo Monfort . ./decibel-audio-player-1.06/doc/ChangeLog0000644000175000017500000004056411456551414020315 0ustar ingelresingelres[+] New feature [-] Bug fixed v1.06 (17/10/10) [+] Albums in the Library can be added to favorites using the popup menu [+] Added an option to search for covers in parent directories as well (#605644) [-] CD explorer not always removed when unloading the CD module (#603902) [-] AudioScrobbler submission blocked by '\0' bytes (#604016) [-] Tracklist scrolls up upon insertion (#607261) [-] List of explorers not kept sorted when renaming a library (#610202) [-] File chooser dialog box does not appear on some systems [-] Can't play previous track from the remote (#656040) [-] Scaling covers should preserve ratio (#654321) [ ] Revamped the preferences dialog box [ ] Respect the "Show hidden files" option when playing tracks from the File Explorer (#611703) [ ] Automatically show preferences the first time the application is started v1.05 (27/06/10) [+] Stick to the Media Player Remote Interface Specifications (#534021) [+] Show some information on the selected tracks in the status bar [+] Added presets to the equalizer [+] [StatusIcon] Middle-click toggles pause, scroll changes volume (Laszlo Pandy) [+] Added Zeitgeist support (#579972) [-] Skips two songs when one is not found (#581654) [-] Fixed crash in some rare occasions when trying to set the cover for the current track [-] Fixed Gnome media keys no longer working when starting/closing multiple instances [-] Fixed labels not always properly updated in the equalizer [ ] Ignore disc number when it looks like '1/1' (#596350) [ ] Improved startup time [ ] The playbin2 GStreamer component is now used by default (use the --playbin flag to use the old playbin component) [ ] Equalizer module has a menu item (CTRL-E) when enabled (#495761) [ ] Close properly on CTRL-C v1.04 (13/05/10) [+] Show album cover in desktop notifications if both modules are enabled (#418076) [+] Added a wildcard (*) for cover names (#541763) [+] Added more keyboard shortcuts to the tracklist (#523689) [+] CD-ROM read speed can be configured (#502297) [+] Added a bitrate column in the tracklist (hidden by default) [-] Drag'n'Drop into the playlist not always working correctly (#501114) [-] Improper sorting when adding tracks that don't all have a performer tag (#509494) [-] Don't allow playback of a disc when there is no disc in the drive [-] Removing a root folder in the File Explorer doesn't work correctly (#496154) [-] Cannot open playlists using backslashes as path separators (#526273) [-] Cannot play files with a percent sign in their path (#528442) [-] Cannot start when view mode was set to nano in v1.02 (#512892) [-] [AudioScrobbler] Song not submitted when quitting while playing (#565828) [-] Fixed passwords not being stored on Ubuntu 10.04 (#578124) [-] Time slider sometimes stops moving (#424976) [-] Fixed lowercase/uppercase issue in the library (#513965) [ ] Gloss effect on covers can be disabled by using the --no-glossy-cover option on the command line (#562905) [ ] "Save as" dialog now opens the last directory used (#523692) [ ] Don't start a new instance when there is already one running (#490719) [ ] Play button plays selected track if any (#511720) v1.03 (10/01/10) [+] Improved the look of the cover thumbnail [-] Fixed grey text not always visible once selected (#331867) [-] Fixed removing a root folder in the File Explorer not working correctly (#496154) [ ] Merged mini and nano modes [ ] Fixed deprecation warnings about the tooltips v1.02 (29/11/09) [+] Added support for .ape files (#425326) [+] In the list of explorers, replace "Audio CD" by the actual disc name when known (#425768) [+] Added support for ac3 and mp2 files (#442843) [+] Added an option to the File Explorer to add files to the playlist by their name (#311427) [-] Fixed files with a '#' character in their path not being played (#428307) [-] Fixed '&' character not correctly displayed in the Library randomness menu (#425132) [-] Fixed improper length for MP3 files without ID3 tags (#426388) [-] Fixed 'play' button not working properly when not already playing/paused (#486983) [-] Fixed a refresh bug causing the application to hang (#473886) [ ] Better behavior of the list of explorers when renaming a library/root folder v1.01 (05/09/09) [+] Added a 10-bands equalizer module (#194506) [+] Added a ReplayGain module (#179094) [+] Added a Twitter module (#415836) [+] "Play a random album" added to the context menu of the Library (#385114) [+] Added support for WavPack files (#343080) [+] Added a revert entry to the tracklist popup menu (#329639) [+] The state of the File Explorer's trees is restored (#414786) [+] Removed the concept of media directories, add directories' contents recursively (File Explorer) (#179998) [+] Replaced the "view" menu by a mode selector (#416823) [-] Fixed a bug related to cropping non-current track (#410199) [-] Fixed remote not working with playlist operations (#390978) [-] Disable the 'skip track' option if the notification server doesn't support actions (#328609) [-] Fixed application not working after locale change (#311293) [-] Fixed Pidgin status not updated by the IMStatus module [-] Fixed misusage of the Gnome keyring (only one password could be stored for the whole app) [-] Restore maximized state properly (#305897) [-] Fixed AudioScrobbler module no longer submitting tracks in case of very bad tags (#307525) [ ] Save preferences when receiving the SIGTERM signal (#211196) [ ] Make the last track the previous track of the first track when repeat is enabled (#324463) [ ] Added '/' as a default folder of the File Explorer for first time users [ ] Removed 'Encoding' key from desktop file (#307714) [ ] Repeat and shuffle icons are no longer hard coded (#308340) [ ] Rewrote the GStreamer-based playback engine, see NOTE below [ ] Added .oga as a valid extension for Ogg Vorbis files [ ] Default application icon size is now 128x128 (better integration with e.g., Gnome Do) [ ] Replaced the md5 module (deprecated) by the hashlib one (#398587) NOTE: Decibel Audio Player can now use the playbin2 GStreamer component, which notably provides a better gapless playback. However, this component is still unstable and can sometimes crash the application. Moreover, older versions of playbin2 cannot play audio CDs. For these reasons, this component is used only if the --playbin2 option is provided on the command line when starting Decibel Audio Player. v1.00 (23/11/08) [+] The cover thumbnail can be clicked or hovered to display a larger version of the cover (#282560) [+] Column headers in the tracklist may be right-clicked to show/hide columns (#286255) [+] Middle-clicking in an explorer adds the selection to the playlist (#285449) [-] Fixed intermittent wrong sort order when adding files to the playlist from the file explorer (#271856) [-] Fixed external Drag'n'Drop not working (#264661) [-] Fixed improper sorting of albums in the Library when the number of discs is above 10 (#273312) [-] Fixed potential crash while loading a library when an artist tag is an empty string (#278470) [-] Fixed a crash when refreshing a library while the root directory no longer exists (#286256) [-] Fixed a bug related to artists' grouping in the Library module (#297765) [-] Fixed a bug preventing some covers to be displayed (#301244) [-] Fixed some date/year tags not being read correctly [ ] Revamped online help [ ] Show the window if it is hidden when unloading the StatusIcon module (#277962) [ ] Added RGBA support (#274390) [ ] Fixed some untranslated strings (#261479) v0.11 (21/08/08) [+] Added a module to display album covers (#179099) [+] Added a panel showing current track information, can be hidden through the 'View' menu [+] Alphabetical headers in the library module can be 'played' (#231259) [+] The status of the repeat button is saved and restored (#232293) [+] Browsing trees with the keyboard is possible (#243169) [+] The explorer panel can be shown/hidden through the 'View' menu (#234721) [+] The MusicBrainz Track ID, if available, is submitted to Last.fm (#256361) [+] More tags are read from the files, and can be displayed in e.g., popups (#256375) [+] Disc number, if any, is displayed right after the album name in the tracklist (#234999) [+] When a track cannot be played (e.g., the corresponding file has been removed), it is tagged with an error icon (#256400) [-] Fixed incorrect entries in the .desktop file (#231714) (#229767) [-] Fixed crash in the Library module upon permission problems (#253574) [-] Fixed crash when tags are present but empty (Library) (#201128) [-] Fixed improper restoration of the volume upon startup when it is equal to zero (#256005) [-] Fixed not correctly submitted tracks with non-standard UTF-8 characters (#259045) [-] Fixed intermittent improper columns resizing in the tracklist [ ] Better default sort order, useful when files are not correctly tagged (#211190) [ ] Immediately hide the main window upon exiting, don't wait for modules (#243186) [ ] Show a 'loading...' message while reading the contents of a directory (File Explorer) (#202603) [ ] Libraries are tagged with a version number, and may need to be rescanned upon structural changes v0.10 (11/05/08) [+] Added a volume button (based on a patch by Matti Mårds -- mamaar@gmail.com) [+] Added support for the "album artist" tag (you will have to rescan your collections) (#152646) [+] Added many new translations [-] Fixed multimedia keys no longer working with Gnome >= 2.22 (#208354) [-] Fixed problems related to icon size (#223559) [-] Fixed bug related to selecting a removed explorer (#211186) [-] Fixed a crash when selecting a File Explorer folder pointing to a deleted folder (#207675) [ ] Removed additional tags previously used in the title of desktop notifications (#200409) [ ] Better "make clean" (thanks to Emilio Pozuelo Monfort) (#186442) v0.09 (27/01/08) [+] Added a module for playing audio CDs (#180771) [+] Added the possibility to rename media folders (File Explorer) and libraries (#160026) [+] Added an option to show a Banshee-like "skip track" button to desktop notifications (#181761) [+] Added a command to set the volume from the remote [+] Added Brazilian Portuguese translation [-] The remote no longer clears the current log file (#179647) [-] Modules are now alphabetically sorted in preferences even in non-english languages (#180754) [ ] Added a manpage for the remote (#181681) v0.08 (31/12/07) [+] The state of libraries' trees is now restored [+] Added D-Bus support (use decibel-audio-player-remote to control the player) [+] Added a "collapse all" entry to the popup menu of Library and FileExplorer modules [+] Added support for mp4 (#179091), mpc, and wma files (check first that the corresponding GStreamer packages are installed!) [+] Added multilingual support, only French is available at the moment [-] Fixed crash in IMStatus when D-Bus is unavailable (#174020) [-] Fixed crash when trying to read a corrupted media file (#176126) [-] Fixed bad layout in AudioScrobbler login dialog (#152783) [ ] One click on the status icon is now enough to show the window when it doesn't have the focus [ ] Moved config directory from ~/.decibel-audio-player to ~/.config/decibel-audio-player (#163614) [ ] Improved a bit the Library module [ ] Some code cleanup v0.07 (18/11/07) [+] Added support for Gnome multimedia keys (#150291) [+] Added logging facilities (log files are located in "~/.decibel-audio-player/Logs/", check them upon errors) [+] A special status icon is now used when playback is paused [+] Added a repeat feature [+] Improved help system [-] Better handling of MP3 files with bad compressed data (#152713) [-] Fixed DesktopNotification not showing title on some Linux distributions (#154925) [-] Fixed tray popup menu positioning [-] Shuffle now ensures that the current track, if any, stays visible [ ] Cleaned tracklist popup menu [ ] Irrelevant tray popup menu items are now disabled instead of being hidden (see GNOME HIG) [ ] Fixed manpage (thanks to Emilio Pozuelo Monfort) v0.06.3 (14/10/07) [-] Fixed a bug with some track number formats for both Ogg Vorbis and Flac files (#152708) [-] Fixed a bug with Pidgin status handling (#152550) [ ] Slightly changed the size of the status icon based on the available space v0.06.2 (13/10/07) [-] Fixed a bug that prevented drag'n'drop from working properly on Ubuntu Gutsy v0.06 (22/09/07) [+] Added a Library module [+] Added a module that generates a text file with the current status [+] Added the possibility to sort the playlist by clicking on column headers [+] Added support for Flac files (check first that the corresponding GStreamer package is installed!) [+] Increased startup speed when restoring a large playlist [-] Fixed some drag'n'drop reordering bugs in the playlist [-] Fixed a bug that prevented multiple selection from working correctly when caps lock was on [ ] Removed some Python 2.5 code for Python 2.4 compatibility [ ] Fixed some entries in the .desktop file (thanks to Emilio Pozuelo Monfort) [ ] A few GUI improvements v0.05.2 (15/08/07) [-] Fixed a bug that prevented the AudioScrobbler module from being loaded when not using Gnome v0.05 (10/08/07) [+] Added a dependency system, that prevents a module from being loaded if it depends on uninstalled Python packages [+] Added a StatusIcon module (adds an icon to the notification area) [+] Added a shuffle feature [+] Added two new fields (playlist position and playlist length) to the available information about a track (e.g., in DesktopNotification) [+] Added a refresh feature to the file explorer (use the popup menu) [+] Added the possibility to show/hide hidden files in the file explorer (use the popup menu) [+] Better drag'n'drop support in the playlist [+] Enabled multiple selection mode in the file explorer [-] Hide the desktop notification upon quitting or stopping if it is still displayed [-] Fixed crash when choosing a directory (in the combo box) that has been deleted [-] Fixed crash when trying to play something that has been removed from the disk v0.04 (07/07/07) [+] Added an AudioScrobbler module (submits tracks to Last.fm) [+] Added preferences to most modules [+] It is now possible to decide whether a module (e.g., DesktopNotification) should be loaded [-] DesktopNotification now reuses the same popup if it is still visible (instead of stacking them) [ ] Added some artwork (thanks to Sébastien Durel -- Babasse@crystalxp.net) v0.03 (07/06/07) [+] Enabled multiple selection in the playlist [+] Enabled external drag'n'drop in the playlist [+] Added a crop menu entry to the popup menu of the playlist [-] Fixed crash when loading a playlist with non-existing files [-] Fixed playlists not being loaded when double-clicking on a directory in the file explorer [-] Fixed separators not showing in the popup menu of the playlist [-] Fixed directories not expandable when unable to access to another directory at the same level in the file explorer [-] Fixed current track not always visible [ ] Modified Makefile to allow the use of a custom installation prefix (thanks to Emilio Pozuelo Monfort) [ ] Miscellaneous usability improvements v0.02 (23/05/07) [+] No more blank between tracks when there should not be [+] Added a file explorer [+] Added a module that updates active IM clients status (supports Gaim >= 2.0 beta6, Gajim, Gossip, Pidgin) [+] Added a popup menu to the playlist [+] Added internal drag'n'drop support to the playlist [+] Added the possibility to save/load playlists [+] Added the possibility to use the seek slider when paused [-] Fixed a visual glitch on notifications when displaying special characters [-] Fixed mp3 files without tags not loading [-] Fixed wrong control buttons state when adding files to the playlist [-] Fixed incorrect behavior of the seek slider v0.01 (13/05/07) [ ] First release ./decibel-audio-player-1.06/doc/decibel-audio-player.10000644000175000017500000000065611456551414022603 0ustar ingelresingelres.TH DECIBEL 1 "May 06, 2007" .SH NAME decibel-audio-player \- a simple audio player .SH SYNOPSIS .B decibel audio player .SH DESCRIPTION \fBDecibel\fP is an audio player that aims at being very straightforward to use. It makes use of the GStreamer library to read audio files. .SH SEE ALSO Homepage: http://decibel.silent-blade.org/ .SH AUTHOR Decibel Audio Player was written by Ingelrest Francois ./decibel-audio-player-1.06/doc/LICENCE0000644000175000017500000004310311456551414017520 0ustar ingelresingelres GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ./decibel-audio-player-1.06/po/0000755000175000017500000000000011456551414016403 5ustar ingelresingelres./decibel-audio-player-1.06/po/sr.po0000644000175000017500000006657411456551414017411 0ustar ingelresingelres# Serbian translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-05-27 12:43+0000\n" "Last-Translator: Branislav Jovanović \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Број песме" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Наслов" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Извођач" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Албум" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Трајање у секундама (на пр. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Трајање као стринг (нпр, 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Позиција нумере у листи нумера" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Пуна путања до фајла" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Непознат албум" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Непознат извођач" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Branislav Jovanović https://launchpad.net/~branej\n" " Jovan Turanjanin https://launchpad.net/~jovan-turanjanin" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Захвалнице:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Потребна је лозинка" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "О безбедности чувања лозинки" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Ако користите Гном, сигурно је да складиштите своју лозинку будући да се " "користи Гномов привезак за кључеве." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Ако не користите Гном, будите свесни да би, мада се лозинка не складишти као " "чист текст, нападач могао да је добави." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Поставке" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Не могу да учитам овај модул." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Модули" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Опис" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Подешавање модула" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Одабери фасциклу" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Ова путања не постоји" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Изаберите постојећи директоријум" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Име је погрешно" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Ово име није дозвољено.\n" "Употребите друго." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Знак %s није дозвољен.\n" "Употребите друго име." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Прилагођавање статуса" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Цензурисање" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Одржавајте свој Last.fm профил ажурним" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "ваш Last.fm налог" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[паузирано]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Морате да их инсталирате уколико желите да омогућите овај модул." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Прилагођавање обавештења" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Паузирај тренутну нумеру" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Репродукуј прву нумеру у листи нумера" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Настави са репродукцијом тренутне нумере" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Дужина" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Сачувај списак песама" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Исеци" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Понови" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Сачувај листу као..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Почетак" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Прикажи скривене фајлове" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Да уклоним изабран унос?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Да уклоним све изабране уносе?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Употреба" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "Збирка" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Организујте своју музику користећи тагове уместо фајлова" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Освежавам збирку" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Правим збирку..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Освежавам збирку..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "нумера" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Да уклоним изабрану збирку?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Да уклоним све изабране збирке?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Разно" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Додај у листу нумера" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Лозинка:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Запамти ову лозинку" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Корисничко име:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "ознака" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Тело" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Наслов" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "секунди" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Преименуј" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Статус" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Не ради ништа" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Порука:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Постави статус на:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Збирке" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Додај нову збирку" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Уклони изабране збирке" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Очисти листу нумера" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Прикажи дијалог о програму" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Репродукуј следећу нумеру" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Репродукуј претходну нумеру" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Изађи из програма" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Тражи позицију у тренутној нумери" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Насумично" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Заустави тренутну нумеру" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Уређивање" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Фајл" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Помоћ" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Име:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Путања:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Фајл" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Статус репродукције" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Репродукуј" ./decibel-audio-player-1.06/po/sl.po0000644000175000017500000006102411456551414017364 0ustar ingelresingelres# Slovenian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-08-15 17:18+0000\n" "Last-Translator: Alan Pepelko \n" "Language-Team: Slovenian \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 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Številka skladbe" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Trajanje v sekundah (npr. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Mesto skladbe v seznamu predvajanja" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Število skladb v seznamu predvajanja" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Pot do datoteke" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Neznan album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Neznan izvajalec" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Alan Pepelko https://launchpad.net/~alan-new" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Razvijalci" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Zahvala" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Potrebno je geslo" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "O varnosti hranjenja gesla" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Če uporabljate namizje Gnome, je varno shraniti vaše geslo, saj je v uporabi " "Gnome keyring." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Če ne uporabljate namizja Gnome, bodite pozorni na to, da napadalec " "lahko pride do vašega gesla, pa čeprav ni shranjeno kot golo besedilo." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/hu.po0000644000175000017500000010462111456551414017363 0ustar ingelresingelres# Hungarian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-03-12 11:15+0000\n" "Last-Translator: gibbis \n" "Language-Team: Hungarian \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Szám sorszáma" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Cím" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Előadó" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Műfaj" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Dátum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Album sorszám" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Időtartam másodpercben (pl. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Időtartam percben (pl. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "A szám pozíciója a lejátszási listában" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Dalok száma a lejátszási listában" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Teljes útvonal a fájlhoz" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disc %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Ismeretlen műfaj" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Ismeretlen cím" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Ismeretlen album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Ismeretlen előadó" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Ismeretlen album-előadó" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " MBA https://launchpad.net/~mbalazs\n" " Szenográdi Norbert Péter https://launchpad.net/~sevoir\n" " gibbis https://launchpad.net/~pal-foldesi\n" " safi https://launchpad.net/~safar-tibor-leo" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Fejlesztő:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Köszönetnyilvánítás:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Adja meg felhasználói nevét és jelszavát, hogy\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Jelszó megadása szükséges" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "A biztonságos jelszótárolásról" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Ha a Gnome-ot használja, biztonságosan tárolhatja jelszavát a Gnome keyring " "használatával." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Ha nem a Gnome-ot használja, vigyázat, habár nem sima szövegként van " "tárolva, egy támadó akár meg is szerezheti." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Beállítások" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Nem tudom betölteni ezt a modult" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Modulok" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Leírás" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "A párbeszédablakban az elérhető modulok listája található, melyek kis " "kódrészletek, amik újabb funkcionalitást nyújtanak az alkalmazásban. Egy " "modult engedélyezni, avagy tiltani lehet az előtte található check-box " "segítségével. Megjegyzés: Bizonyos modulokat - pl. a File Böngészőt - nem " "lehet letiltani." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Modul beállítása" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Mikor egy modul külön beállítható, egy jellegzetes ikon jelenik meg a sor " "jobb oldalán. Hogy beállíthassuk a modult, válasszuk ki a beállítani kívánt " "modult, majd kattintsunk a \"Beállítások\" gombra a dialógus-ablak aljában. " "Megjegyzés: csak akkor lehet beállításokat eszközölni egy modulnál, ha az " "előzőleg engedélyezve lett." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Válasszon mappát" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Ez az útvonal nem létezik" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Kérem, válasszon ki egy már létező könyvtárat." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "A név helytelen" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "E név használata nem engedélyezett.\n" "Kérem, használjon másikat!" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "A %s karakter nem engedélyezett.\n" "Kérem, használjon másik nevet!" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Instant Messenger Státusza" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "A chat-kliensének státuszüzenetének frissítése" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "A Decibel le van állítva" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [paused]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Ez a modul felismeri bármely futó chat-kliensét, és frissíti annak státuszát " "az alapján, hogy éppen milyen számot hallgat. A támogatott chat-kliensek " "listája:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "A Státusz testreszabása" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "A státuszt tetszőleges szövegre állíthatja. Mielőtt beállítaná, a modul az " "összes {field} mezőt a megfelelő értékre állítja. A használható mezők " "listája:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Leíró nyelv" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "A szöveg formázására a Pango leíró nyelvet használhatja. További információ " "erről a nyelvről a következő weboldalon található:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Szanitálás" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Megadhat szavakat, melyeket cenzúrázva szeretne látni, mikor a státuszát " "beállítja. Ebben az esetben a megfelelő szavak nem kezdő és nem záró " "karakterei automatikusan csillag karakterrel (*) lesznek helyettesítve, pl. " "'Erie Maffia - B***d fel a kéket'. Soronként egy szót írjon." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Tartsa karban Last.fm profilját" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "az Ön Last.fm felhasználói fiókja" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Egy zeneszám a lejátszási listában [%(length)s]" msgstr[1] "%(count)u zeneszám a lejátszási listában [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[szüneteltetve]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "A következő Python modulok nem találhatók:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "A modul engedélyezéséhez telepítenie kell azokat." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Értesítés az Írópulton" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Értesítsen az Írópulton számváltáskor" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Zeneszám kihagyása" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Ez a modul apró felugró ablakot jelentet meg az Írópulton, mikor új zeneszám " "indul." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Az értesítés testreszabása" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Az értesítési ablak szövege tetszőlegesen változtatható. Mielőtt megjelenik " "a felugró értesítési ablak, a {field} mezők a megfelelő értékekkel lesznek " "kitöltve. A lehetséges értékek:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Az aktuális zeneszám szüneteltetése" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "A lejátszási listán az első szám lejátszása" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Az aktuális zeneszám továbbjátszása" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Kérem, válasszon böngészőt\n" "az alábbi listából." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Hossz" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Lejátszólista mentése" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Vágás" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Ismétlés" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Lejátszólista mentése másként..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "File böngésző" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Fájlrendszer böngészése" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Kezdőlap" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "töltés folyamatban..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Rejtett fájlok megjelenítése" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Ezt a gyökérkönyvtárat később is hozzáadhatja." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "A kiválasztott elem eltávolítása?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Ezeket a gyökérkönyvtárakat később is hozzáadhatja." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "A kiválasztott elemek eltávolítása?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "A médiafájljai nem kerülnek törlésre." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Ez a modul lehetővé teszi az Ön meghajtójain található fájlok böngészését." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Használat" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Legalább egy gyökérkönyvtárat meg kell adnia ahhoz, hogy tudjon böngészni a " "fájljai közt. Ez a mappa a főablakban található fájlböngésző gyökerévé válik." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Médiatár" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Rendezze a fájljait tagek segítségével fájlok helyett" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Médiatár létrehozása" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Médiatár frissítése" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "A mappában médiafájlok keresése folyik. Ez kis időt vehet igénybe.\n" "Kérem, várjon." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Mappákban való keresés (egy zeneszám felfedezve)" msgstr[1] "Mappákban való keresés (%(nbtracks)u zeneszám felfedezve)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Médiatár létrehozása..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Médiatár frissítése..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Ez a médiatár elavult, kérem, frissítse." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "számok" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Később újra létrehozhatja ezt a médiatárat, ha úgy kívánja." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "A kiválasztott médiatár eltávolítása?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Később újra létrehozhatja ezeket a médiatárakat, ha úgy kívánja." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Az összes kijelölt médiatár eltávolítása?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "A médiafájljai nem kerülnek törlésre." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Ez a modul ahelyett, hogy a merevlemeze fájlstruktúráját venné alapul, tagek " "alapján rendezi médiafájljait. A számok betöltése is gyorsabb, mivel a " "tagjeik már ismertek és nem kerülnek újból beolvasásra." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Új médiatár hozzáadásánal meg kell adnia a médiatár gyökérmappájához vezető " "teljes elérési útvonalat. Ezután az összes e gyökérútvonal alatt található " "mappa beolvasásra kerül, a felfedezett médiafájlok tagjei pedig egy " "adatbázisban kerülnek tárolásra." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Mikor médiatárat frissít, az összes a gyökérútvonal alatt található mappa és " "az összes médiafájl újból beolvasásra kerül, hogy az adatbázis naprakész " "legyen." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Státusz ikon" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Ikon hozzáadása az értesítési zónához" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [szüneteltetve]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Hangzó lemez" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Hangzó lemezek lejátszása" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "adatok letöltése..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "%02u zeneszám" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Nem találtam lemezt" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "A művelet az összes, a merevlemezén tárolt lemezinformációt törli." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "CDDB gyorsítótár ürítése?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Érvénytelen útvonal" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "A CD-ROM elérési útvonala helytelen. Kérem, válasszon ki egy létező elérési " "útvonalat." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Ennek a modulnak segítségével hangzó lemezeket játszhat le a CD-ROM-" "lejátszójával." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "CD Adatbázis (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Lemezinformációk, úgymint előadó és az album címe, ha úgy kívánja, " "automatikusan letölthető egy online adatbázisból. Ez az információ mentésre " "kerülhet a merevlemezén annak érdekében, hogy ne kelljen újból letölteni, " "mikor ismét ugyanazt a lemezt játsza le." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "%(album)s albumról\n" "%(artist)s előadó" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Borítók" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Lemezborítók megjelenítése" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Ez a modul megjeleníti annak az albumnak a borítóját, melyhez a jelenleg " "játszott szám tartozik. A borítók helyi hozzáférésű képekből, ugyanabból a " "mappából származhatnak, vagy letölthetők az internetről." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Felhasználói borítók" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "A felhasználó lemezborítójaként egy kép van használva az épp lejátszott " "zeneszám könyvtárából. A filenevek megadásánál nem szükséges a " "kiterjesztések megadása, automatikusan a támogatott (%s) formátumokat " "használja." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Internetes lemezborítók." #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Lemezborítók az internetröl tölthetőek le a zeneszámok tag-jei alapján. " "Beállíthatja hogy a felhasználói borítókat használja az internetröl " "letölthetöekkel szemben. Ebben az esetben ha a zeneszám mellett létezik " "borító, az lesz használva. Ha nincsen akkor az internetöl letöltött." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Státusz file." #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Egy szövegfile-t generál a pillanatnyi státusszal" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "A kvalasztott file elérési útvonala érvénytelen. Kérem válasszon egy létező " "útvonalat." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Válasszon fájlt" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Ez a modul egy szövegfájlt generál az éppen játszott zeneszámmal " "kapcsolatban." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "File testreszabása" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Megvátoztathatja a file tartalmát bármilyen kívánt szövegre. Mielőtt a file " "generálása megkezdődik a {field} mezők helyettesítve lesznek a megfelelő " "mezők értékeivel. A használható mezők a következők:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Egyéb" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM ezköz" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Gyorsítótár törlése" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Lemez informáciió letöltése" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Lemez informáciió letöltése egy online adatbázisból" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "A CD-ROM eszköz elérési útvonala" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Az osszes (zene)lemez informácio eltávolítása a merevlemezről" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Lemez(zene) információ merevlemezre való mentése" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Információ helyi gyorsítótárba való mentése" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Hozzáadás a lejátszólistához" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Kiválasztottak lejátszási listába való (be)toldása" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" "Lejátszási lista helyettesítése a kiválasztott elemekkel és a lejátszás " "kezdése" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Audio lemez újraolvasása" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Jelszó:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Jelszó megjegyzése" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Felhasználónév:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "címke" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Internet lemezborítók" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Felhasználói lemezborítók" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Mindíg a felhasználói lemezborítók használata van előnyben" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Ne töltsön le lemezborítót ha létezik felhasználói borító" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Lemezborítók letöltése" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Mely file-neveket keressek (pl. könyvtárnév, lemezborító)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Filenevek" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Próbálja a lemezborítok internetről való letöltését" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Törzs" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Cím" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Értesítés időhossz:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "A \"szám kihagyása\" gomb mutatása" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "mennyi ideig lesz az értesítés mutatva" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "másodperc" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Gyökér könyvtárak" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Új gyökérkönyvtár hozzáadása a böngészőhöz" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "A kiválasztott gyökérkönyvtár eltávolítása." #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Átnevezés" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "A kiválasztott gyökérkönyvtár átnevezése" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Az eldugott fileoknak látszodniuk kellene a bongészőben" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Nemkívánatos szavak" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Állapot" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Mikor leáll vagy kilép" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Ne tegyen semmit" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Üzenet:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Állapot beállítása:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Frissítse akkor is ha nem elérhet" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Frissítés mikor megéllítva" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Frissíti a státuszát még akkor is ha az nem elérhető." #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Státuszának a frissítése a leállítás/újraindítás eseményekre" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Könyvtárak" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Új könyvtár hozzáadása" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "A kiválasztott könyvtárak eltávolítása" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Kiválasztott könyvtáár átnevezése" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "A kiválasztott könyvtár frissítése a merevlemez újraolvasásával" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Tisztítás" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Lejátszólista törlése" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "About dailógus mutatása." #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Beállítások mutatása" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Az eltelt idő" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Online _Help" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Online segítség weboldal megnyitása" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Az összes szám végtelenített lejátszása" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Következő szám lejátszása" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Előző szám lejátszása" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Kilépés az alkalmazásból" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Maradék idő" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Aktuáis számban való keresés" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Válasszon ki egy böngészőt" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Keverés" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Lejátszási lista találomra való lejátszása" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Aktuális szám megállítása" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Szerkesztés" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fájl" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Segítség" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Név:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Útvonal:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fájl" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Lejátszási állapot" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Lejátszás" ./decibel-audio-player-1.06/po/fa.po0000644000175000017500000006007111456551414017335 0ustar ingelresingelres# Persian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-03-29 07:34+0000\n" "Last-Translator: Artin \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "آلبوم ناشناخته" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "هنرمند ناشناخته" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Artin https://launchpad.net/~artin" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "با تشکر از:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "تنظیمات‌" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "شرح" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/ko.po0000644000175000017500000006502011456551414017357 0ustar ingelresingelres# Korean translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2007-12-14 15:54+0000\n" "Last-Translator: onlyeriko \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "트랙 번호" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "제목" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "가수" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "앨범" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "지속 시간" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "일련의 지속" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "트랙 실행 위치" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "트랙 실행 번호" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "파일 경로" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "알 수 없는 앨범" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "알 수 없는 아티스트" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " onlyeriko https://launchpad.net/~onlyeriko" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "고마운 사람:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "암호 필요" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "패스워드 안전하게 저장" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "Gnome을 사용한다면 당신의 패스워드는 안전하다" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "Gnome을 사용하지 않을지라도 저장하지 않은 지워진 텍스트라도 회복 가능하다" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "환경설정" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "열수없는 모듈" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "모듈" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "설명" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "폴더 선택" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "존재 하지 않는 경로" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "디렉토리 선택" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "부정확한 이름" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "허락받지 않는 이름" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "문자 %s 사용될 수 없음, 다시 입력하세요" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "긴박한 메신저 상태" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "IM 클라이언트 업데이트" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel 정지" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "설정 바꿈" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "마크업" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "Pango 마크업 언어 형식의 텍스트로 사용. 웹페이지에서 불러온 언어 정보를 이용" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "부분 삭제" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "일시정지" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Python 모듈에 이용 할수 없는" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "모듈 사용위해 인스톨해야 함" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "데스크탑 신고서" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "트랙 바꿀 때 출력" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "새 트랙 시작 시 윈도우에 작은 팝업으로 디스플레이" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "환경 설정 확인" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "현재 트랙 정지" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "플레이 리스트 첫번째" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "현재 트랙 계속" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "길이" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "재생목록 저장" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "다듬기" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "반복" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "연주 목록 다른 이름으로 저장..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "파일 찾기" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "홈" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "숨은 파일 보기" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "선택된 입력 제거" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "선택된 입력 모두 제거" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "선택된 파일 지우지 못함" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "사용량" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "라이브러리" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "라이브러리 만듦" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "라이브러리 리프레쉬" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "디렉토리 내 파일 찾지 못함." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "라이브러리 만들기" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "리프레쉬 라이브러리" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "트랙" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "나중에 라이브러리 다시 만듦" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "선택된 라이브러리 제거" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "나중에 라이브러리 다시 만듦" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "선택된 라이브러리 모두 제거" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "파일 제거되지 않음" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "아이콘 상태" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "아이콘 추가 확인" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "잘못된 경로" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "파일 상태" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "파일 경로가 확실하지 않음. 다시 경로 선택" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "파일 선택" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "파일 설정 바꿈" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "기타" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "재생목록에 더하기" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "패스워드:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "이 열쇠글 기억" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "사용자 이름:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "레이블" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Body" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "타이틀" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "타임 아웃" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "초" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "루트 폴더" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "새로운 루트 폴더 추가" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "선택된 루트 폴더 제거" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "삭제단어" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "상태" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "아무 것도 하지 않음." #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "메시지:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "상태 설정" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "이용하지 않더라도 업데이트" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "정지 때 업데이트" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "라이브러리" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "새로운 라이브러리 추가" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "선택된 라이브러리 제거" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "다시 읽은 라이브러리 업데이트" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "플레이리스트 제거" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "다이얼로그 박스 디스플레이" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "디스플레이 설정" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "온라인 도움" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Help 웹 페이지 열기" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "다음 트랙 재생" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "이전 트랙 재생" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "프로그램 끝내기" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "무작위" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "현재 트랙 정지" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "편집" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "파일" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "도움말" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "이름:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "경로:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "파일" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "재생 상태" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "다시 재생" ./decibel-audio-player-1.06/po/es.po0000644000175000017500000010504511456551414017357 0ustar ingelresingelres# Spanish translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-05-14 19:37+0000\n" "Last-Translator: Carlos Andrés Albornoz Concha \n" "Language-Team: Spanish \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Número de pista" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Título" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artista" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Álbum" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Género" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Fecha" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Número del disco" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Duración en segundos" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Duración como cadena (p. ej. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Posición de la pista en la lista de reproducción" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Número de pistas en la lista de reproducción" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Ruta completa al archivo" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disco %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Género desconocido" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Título desconocido" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Álbum desconocido" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artista desconocido" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Artista del álbum desconocido" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Carlos Andrés Albornoz Concha https://launchpad.net/~caralbornozc\n" " Darío Sadler https://launchpad.net/~zeroz-dario\n" " Emilio Pozuelo Monfort https://launchpad.net/~pochu\n" " Mark Baas https://launchpad.net/~mark-baas123\n" " Paco Molinero https://launchpad.net/~franciscomol\n" " Servilio Afre Puentes https://launchpad.net/~servilio\n" " Teleporter https://launchpad.net/~teleporter7000\n" " syvic https://launchpad.net/~syvic" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Desarrollador:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Gracias a:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Entre su nombre de usuario y contraseña para\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Contraseña requerida" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Acerca del almacenaje seguro de claves" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Si usa GNOME, es seguro almacenar su clave ya que se usa el gestor de claves " "de GNOME." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Si no usa GNOME tenga en cuenta que, aunque no guarde la clave en texto " "plano, un atacante podría conseguirla." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferencias" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Imposible cargar este módulo" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Módulos" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descripción" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Este cuadro de diálogo muestra la lista de módulos disponibles, los cuales " "son pequeñas piezas de código que agregan algunas funcionalidades a la " "aplicación. Puede activar/desactivar un módulo marcando/desmarcando el " "cuadro de verificación en el frente de éste. Tenga en cuenta que algunos " "módulos (ej. el Explorador de archivos) no pueden ser desactivados." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configurando un módulo" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Cuando un modulo puede ser configurado, un icono se muestra a la derecha en " "la linea correspondiente. Para configurar un modulo simplemente selecciónelo " "y luego haga clic en el botón \"Preferencias\" en la parte inferior de la " "ventana de diálogo. Note que configurar un módulo es sólo posible cuando " "está activado" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Elija una carpeta" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Esta ruta no existe" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Por favor seleccione un directorio existente" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "El nombre es incorrecto" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Este nombre no es permitido.\n" "Por favor use otro." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "EL caractér %s no está permitido.\n" "Por favor use otro nombre." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Estado del mensajero instantáneo" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" "Actualizar el mensaje de estado de tu cliente de mensajería instantánea" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel está detenido" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [pausado]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Este modulo detecta cualquier cliente de mensajería instantánea corriendo y " "actualiza su estado relativo a la pista que usted esté escuchando. \r\n" "Los clientes de mensajería soportados son:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Personalizar el Estado" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Puede configurar el estado a cualquier texto que desee. Antes de " "configurarlo, el módulo reemplaza todos los campos de la forma {campo} a sus " "valores correspondientes. Campos disponibles:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Marcado" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Puede usar la idioma de Pango markup para formatear el texto. Mas " "información sobre este lenguaje está disponible en la siguiente página web:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Higienización" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Puedes definir algunas palabras para higienizar antes de usarlas para poner " "tu estado. En este caso, los caracteres en el medio de las palabras " "coincidentes son reemplazadas automáticamente por asteriscos (ej. " "\"Metallica - Live S**t Bing & Purge\"). Pon una palabra por línea." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Mantenga actualizado su perfil de Last.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "su cuenta de Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Una pista en la lista de reproducción [%(length)s]" msgstr[1] "%(count)u pistas en la lista de reproducción [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausado]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Los siguientes módulos de Python no están disponibles:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Debe instalarlos si quiere activar este módulo." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notificación de escritorio" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Mostrar una notificación de escritorio al cambiar la pista" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Saltar pista" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Este módulo muestra una ventanita en su escritorio cuando comienza una pista " "nueva." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Personalizando la notificación" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Puede cambiar el título y el cuerpo de la notificación a cualquier texto que " "quiera. Antes de mostrar la ventanita, los campos de la forma {campo} se " "reemplazarán por el valor correspondiente. Campos disponibles:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pausar la pista actual" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Reproducir la pista primera de la lista de reproducción" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continuar reproduciendo la pista actual" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Por favor, elija un explorador\n" "en el cuadro combinado de abajo." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Duración" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Guardar lista de reproducción" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Achicar" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Repetir" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Guardar lista de reproducción como..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Explorador de archivos" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Explorar tu sistema de archivos" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Carpeta personal" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "cargando…" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Mostrar archivos ocultos" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Usted podrá añadir esta carpeta raíz nuevamente más adelante si así lo desea." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "¿Eliminar la entrada seleccionada?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Usted podrá añadir estas carpetas raíz nuevamente más adelante si así lo " "desea." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "¿Eliminar todas entradas seleccionadas?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Tus archivos multimedios no serán eliminados" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Este módulo le permite explorar los archivos en tus discos." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Uso" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Para explorar sus archivos debe adicionar al menos una carpeta raíz. Esta " "carpeta será la raíz del árbol de exploración en la ventana principal." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Biblioteca" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organizar tu música por etiquetas en vez de archivos" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Creando biblioteca" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Actualizando biblioteca" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Se examina el directorio buscando buscando archivos multimedios. Esto puede " "tomar un tiempo.\n" "Por favor, espere." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Examinando directorios (una pista encontrada)" msgstr[1] "Examinando directorios (%(nbtracks)u pistas encontradas)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Creando biblioteca..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Actualizando biblioteca..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Esta biblioteca está deprecada, por favor refrésquela." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "pistas" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Podrá recrear esta biblioteca más adelante si así lo desea." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "¿Eliminar la biblioteca seleccionada?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Podrá recrear estas bibliotecas más adelante si así lo desea." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "¿Eliminar todas bibliotecas seleccionadas?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Tus archivos multimedios no serán eliminados." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Este módulo organiza tus archivos multimedios por etiquetas en vez de usar " "la estructura de carpetas de tu disco. La carga de pistas es también más " "rápida porque sus etiquetas ya se conocen y es necesario leerlas otra vez." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Cuando añade una biblioteca nueva, debe dar la ruta completa al directorio " "raíz de esta biblioteca. Entonces, todos los directorios en esta ruta raíz " "se examinarán recursivamente para archivos multimedios cuyas etiquetas se " "han leído y almacenado en una base de datos." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Al actualizar una biblioteca, la estructura de archivos bajo el directorio " "raíz y todos los archivos multimedios son examinados en busca de cambios " "para actualizar la base de datos en consecuencia." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Ícono de estado" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Añadir un icono al área de notificación" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [pausado]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD de audio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Reproducir discos de audio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "descargando datos..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Pista %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "No se encuentra ningún disco" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Esto eliminará toda información del disco almacenado en tu disco duro." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "¿Limpiar caché de CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ruta inválida" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "La ruta al dispositivo de CD-ROM no es válida. Por favor elija una ruta " "válida." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Éste módulo te permite reproducir discos de audio desde tu dispositivo de CD-" "ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Base de Datos de Discos Compactos" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "La información del disco, tal como el artista y título del álbum, puede ser " "descargada automáticamente desde una base de datos en línea si así lo desea. " "Esta información puede ser guardada en su disco duro para evitar descargarla " "nuevamente la próxima vez que reproduzca el mismo disco." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "por %(artist)s\n" "de %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Caratulas" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Mostrar caratulas de álbumes" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Éste módulo muestra la caratula del álbum del cual procede la pista actual. " "Las caratulas pueden cargarse de imágenes locales, localizadas en el mismo " "directorio que la pista actual, o pueden ser descargadas desde Internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Caratulas del usuario" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Una caratula del usuario es una imagen localizada en el mismo directorio que " "la pista actual. Cuando se especifican nombres de archivos, usted no " "necesita proveer extensiones de archivos, los formatos de archivos " "soportados (%s) se usan automáticamente." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Caratulas de Internet" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Las caratulas pueden descargarse de Internet, basándose en las etiquetas de " "la pista actual. Usted puede pedir que siempre se prefieran las caratulas " "del usuario a las de Internet. En este caso, si una caratula del usuario " "existe para la pista actual, ésta se usa. Si no hay ninguna, la caratula " "será descargada." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Archivo de estado" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Generar un archivo texto con el estado actual" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "La ruta al archivo seleccionado no es válida. Por favor elija una ruta " "existente." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Elija un archivo" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Este módulo genera un archivo de texto con información acerca de la pista en " "reproducción." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Personalizar el archivo" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Puedes cambiar el contenido del archivo a cualquier texto si así lo deseas. " "Antes generar el archivo, los campos con la forma {campo} se reemplazan por " "sus valores correspondientes. Los campos disponibles son:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Varios" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Dispositivo de CD-ROM" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Limpiar la caché" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Descargar información del disco" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Descargar información del disco de una base de datos en linea" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Localización de tu dispositivo de CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Eliminar toda información del disco de tu disco duro" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Guardar información del disco en tu disco duro" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Guardar información en la caché local" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Añadir a la lista de reproducción" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Añadir selección a lista de reproducción" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" "Reemplezar la lista de reproducción por la selección y comenzar a reproducir" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Examinar el disco de audio otra vez" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Contraseña:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Recordar esta contraseña" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Nombre de usuario:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etiqueta" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Caratulas de Internet" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Caratulas del Usuario" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Siempre preferir las caratulas del usuario" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "No descargar caratulas cuando hay una del usuario" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Descargar caratulas" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Nombres de archivos a buscar (ej.: carpeta, caratula)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Nombres de archivos:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Intentar descargar caratulas desde Internet" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Cuerpo" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Título" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Tiempo límite de la notificación:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Mostrar un boton \"saltar pista\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Tiempo para mostrar notificación" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "segundos" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Carpeta raíz" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Añadir una carpeta raíz nueva al explorador de los archivos" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Eliminar la carpetas raíces seleccionadas" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Renombrar" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Renombrar la carpeta raíz seleccionada" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" "Si los archivos ocultos deberían mostrarse en el explorador de archivos" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Palabras Higienizadas" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Estado" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Al detener o salir" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "No hacer nada" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Mensaje:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Configurar estatus a:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Actualizar estado incluso si no está disponible" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Actualizar al pausar" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Actualizar su estado incluso si está marcado como no disponible" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Actualizar tu estado en eventos de pausar/continuar" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotecas" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Añadir una biblioteca nueva" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Eliminar las bibliotecas seleccionadas" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Renombrar la biblioteca seleccionada" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Actualizar la biblioteca seleccionada con un examen del disco" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Limpiar" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Limpiar la lista de reproducción" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Mostrar el diálogo \"Acerca de...\"" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Preferencias de visualización" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tiempo transcurrido" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "A_yuda en linea" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Abrir el pagina web de ayuda en linea" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Reproducir todas pistas sin detener" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Reproducir la pista siguiente" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Reproducir la última pista" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Termina la aplicación" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tiempo restante" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Buscar una posición en la pista actual" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Elija un explorador" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Desordenar" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Desordenar la lista de reproducción" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Detener la pista actual" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Edición" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Archivo" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "A_yuda" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nombre:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Ruta:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Archivo" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Estado de reproducción" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Reproducir/Unpausar" ./decibel-audio-player-1.06/po/nb.po0000644000175000017500000006423311456551414017352 0ustar ingelresingelres# Norwegian Bokmal translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-05-16 19:06+0000\n" "Last-Translator: mamaar \n" "Language-Team: Norwegian Bokmal \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Spornummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Tittel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artist" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Spilletid i sekunder (f.eks. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Spilletid som en streng (f.eks. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Plassen til sporet i spillelisten" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Antall spor i spillelisten" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Full sti til filen" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Ukjent album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Ukjent artist" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " mamaar https://launchpad.net/~mamaar" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Utvikler:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Takk til:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Passord er påkrevd" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Om passordlagringstrygghet" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Dersom du bruker Gnome, er det trygt å lagre passordet siden Gnome-" "nøkkelringen brukes." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Dersom du ikke bruker Gnome, vær klar over at en angriper kan få tak " "i passordet, selvom det ikke blir lagret i klartekst." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Kunne ikke laste modulen." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduler" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Beskrivelse" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Konfigurer en modul" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Velg en mappe" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Denne stien finnes ikke" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Velg en eksisterende mappe." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Navnet er feil" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Dette navnet er ikke tillatt.\n" "Bruk et annet." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Tegnet %s er ikke tillatt.\n" "Bruk et annet navn." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Lynmeldingsstatus" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Oppdater statusmeldingen til IM-klienten din" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel er stoppet" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Tilpasse statusen" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Sensurering" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Hold Last.fm-profilen din oppdatert" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Last.fm-kontoen din" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Følgende Python-moduler er ikke tilgjengelige:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Du må installere de dersom du ønsker å aktivere denne modulen." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Spill første sporet i spillelisten" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Lengde" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Lagre spilleliste" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Lagre spilleliste som..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Filutforsker" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Bla gjennom filsystemet" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Hjem" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Vis skjulte filer" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Du kan legge til denne rotmappen igjen senere dersom du ønsker det." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Du kan legge til disse rotmappene igjen senere dersom du ønsker det." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Fjerne alle valgte oppføringer?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Dine mediafiler vil ikke bli slettet." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Denne modulen lar deg bla gjennom filene på diskene dine." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliotek" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Lager bibliotek" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Oppdaterer bibliotek" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Mappen blir søkt gjennom etter mediafiler. Dette kan ta litt tid.\n" "Vent litt." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Lager bibliotek..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Oppdaterer bibliotek..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "spor" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Du kan lage dette biblioteket på nytt senere dersom du ønsker det." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Fjerne det valgte biblioteket?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Mediafilene vil ikke bli fjernet." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Statusikon" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Lyd-CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "laster ned data..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "Dette vil fjerne all diskinformasjon lagret på harddisken din." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ugyldig sti" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Statusfil" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Genererer en tekstfil med gjeldene status" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "Stien til den valgte filen er ikke gyldig. Velg en eksisterende sti." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Velg en fil" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Legg til spilleliste" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Passord:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Husk dette passordet" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Brukernavn:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Tittel" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Gi nytt navn" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Sensurerte ord" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Ikke gjør noe" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotek" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Legg til bibliotek" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Tøm" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Tøm spillelisten" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Velg en utforsker" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Stokk" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Stokk spillelisten" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fil" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Hjelp" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Navn:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Sti:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fil" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/sv.po0000644000175000017500000010217511456551414017401 0ustar ingelresingelres# Swedish translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-03-12 11:04+0000\n" "Last-Translator: gibbis \n" "Language-Team: Swedish \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Spårnummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artist" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genre" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Datum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Skiva" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Speltid i sekunder (t.ex. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Speltid som en sträng (t.ex. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Spårets position i spellistan" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Antal spår i spellistan" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Fullständig sökväg till filen" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Skiva %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Okänd genre" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Okänd titel" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Okänt album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Okänd artist" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Okänd albumartist" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Daniel Nylander https://launchpad.net/~yeager\n" " gibbis https://launchpad.net/~pal-foldesi\n" " larlin https://launchpad.net/~larlin\n" " nicke https://launchpad.net/~niklas-aronsson" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Utvecklare:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Tack till:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Ange ditt användarnamn och lösenord för\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Lösenord krävs" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Om säkerhet för lösenordslagring" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Om du använder Gnome är det säkert att lagra ditt lösenord eftersom Gnome-" "nyckelring används." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Om du inte använder Gnome så bör du känna till en attackare skulle " "kunna komma över det, även om det inte lagrats i klartext." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Inställningar" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Kunde inte läsa in denna modul." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduler" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Beskrivning" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Denna dialogruta visar listan över tillgängliga moduler, vilka är små delar " "av kod som lägger till viss funktionalitet till programmet. Du kan " "aktivera/inaktivera en modul genom att kryssa i/av i kryssrutan framför den. " "Observera att vissa moduler (t,ex, Filutforskaren) inte kan inaktiveras." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Konfiguration av en modul" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "När en modul kan konfigureras kommer en specifik ikon att visas till höger " "på motsvarande rad. För att konfigurera en modul, \r\n" "markera helt enkelt modulen och klicka sedan på knappen \"Inställningar\" i " "nederkant av dialogrutan. Observera att konfiguration av en modul endast är " "möjlig när den är aktiverad." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Välj en mapp" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Den här sökvägen finns inte" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Välj en befintlig katalog." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Namnet är felaktigt" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Det här namnet tillåts inte.\n" "Använd ett annat namn." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Tecknet %s är inte tillåtet.\n" "Använd ett annat namn." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Status för chatklient" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Uppdatera statusmeddelandet för din chatklient" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel är stoppad" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [pausad]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Denna modul upptäcker om någon chatklient körs och uppdaterar din status med " "information om spåret som du lyssnar på. Klienter som stöds är:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Anpassa statusen" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Du kan ställa in status till valfri text. Innan den ställs in kommer modulen " "att ersätta alla fält i formuläret {field} med motsvarande värde. " "Tillgängliga fält är:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Markup" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Du kan använda markupspråket Pango för att formatera texten. Mer information " "om språket finns tillgänglig på följande webbsida:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Städning" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Du kan definiera vissa ord som kan städas bort innan de används för att " "ställa in din status. I detta fall kommer mellersta bokstäverna av matchande " "ord att automatiskt ersättas med stjärnor (t.ex., \"Metallica - Live S**t " "Binge & Purge\"). Ange ett ord per rad." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Håll din Last.fm-profil uppdaterad" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "ditt Last.fm-konto" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Ett spår i spellistan [%(length)s]" msgstr[1] "%(count)u spår i spellistan [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausad]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Följande Python-moduler är inte tillgängliga:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Du måste installera dem om du vill aktivera denna modul." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Skrivbordsnotifieringar" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Visa en skrivbordsnotifiering vid spårbyte" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Hoppa över spår" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Denna modul visar ett litet popupfönster på ditt skrivbord när ett nytt spår " "börjar." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Anpassa notifieringen" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Du kan ändra titeln och texten för notifieringen till valfri text. Innan " "popupfönstret visas kommer fälten i formuläret {field} att ersättas med " "deras motsvarande värden. Tillgängliga fält är:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pausa det aktuella spåret" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Spela det första spåret i spellistan" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Fortsätt spela det aktuella spåret" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Välj en utforskare i\n" "nedanstående ruta." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Speltid" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Spara spellista" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Klipp ut" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Upprepa" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Spara spellista som..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Filutforskare" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Bläddra i ditt filsystem" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Hem" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "läser in..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Visa dolda filer" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Du kommer senare att kunna lägga till denna rotmapp igen om du så önskar." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Ta bort det markerade objektet?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Du kommer senare att kunna att lägga till dessa rotmappar igen om du så " "önskar." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Ta bort alla markerade objekt?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Dina mediafiler kommer inte att tas bort." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Denna modul låter dig bläddra i filerna på dina enheter." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Användning" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Åtminstone en rotmapp måste läggas till för att bläddra i dina filer. Denna " "mapp kommer sedan att bli roten för filutforskarens träd i huvudfönstret." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliotek" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organisera din musik efter taggar istället för filer" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Skapar bibliotek" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Uppdaterar bibliotek" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Katalogen söks igenom efter mediafiler. Det kan ta lite tid.\n" "Var god vänta." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Söker igenom kataloger (ett spår funnet)" msgstr[1] "Söker igenom kataloger (%(nbtracks)u spår funna)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Skapar bibliotek..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Uppdaterar bibliotek..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Detta bibliotek är förlegat. Du bör uppdatera det." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "spår" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" "Du kommer senare att kunna återskapa detta bibliotek om du så önskar." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Ta bort markerat bibliotek?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" "Du kommer senare att kunna återskapa dessa bibliotek om du så önskar." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Ta bort alla markerade bibliotek?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Dina mediafiler kommer inte att tas bort." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Denna modul organiserar dina mediafiler med taggar istället för att använda " "filstrukturen för din enhet. Inläsning av spåren blir också snabbare därför " "att deras taggar redan är kända och behöver inte läsas av igen." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "När du lägger till ett nytt bibliotek kommer du att behöva ange komplett " "sökväg till rotkatalogen för det biblioteket. Sedan kommer alla kataloger " "under denna rotsökväg att rekursivt sökas igenom efter mediafiler vars " "taggar läses in och lagras i en databas." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Vid uppdatering av ett bibliotek kommer filstrukturen under rotkatalogen och " "alla mediafiler att sökas av efter ändringar för att uppdatera databasen." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Statusikon" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Lägg till en ikon i notifieringsytan" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [pausad]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Ljud-cd" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Spela upp ljudskivor" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "hämtar data..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Spår %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Ingen skiva hittades" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Det här kommer att ta bort all skivinformation som lagrats på din hårddisk." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Töm CDDB-cache?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ogiltig sökväg" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Sökvägen till cd-rom-enheten är inte giltig. Välj en befintlig sökväg." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "Denna modul låter dig spela upp ljudskivor från din cd-rom-enhet." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc Data Base (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Skivinformation, såsom artist och albumtitel, kan automatiskt hämtas ner " "från en databas på Internet om du så önskar. Denna information kan även " "sparas på din hårddisk för att undvika att hämta ner den igen nästa gång som " "du spelar samma skiva." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "av %(artist)s\n" "från %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Omslagsbilder" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Visa omslagsbilder" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Denna modul visar omslagsbilden från det album som det aktuella spåret " "kommer från. Omslagsbilder kan hämtas från lokala bilder från samma katalog " "som det aktuella spåret, eller hämtas ner från Internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Lokala omslagsbilder" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Ett användaromslag är en bild som finns i samma katalog som det aktuella " "spåret. När filnamn anges så behöver du inte ange filens ändelse efter som " "stödda filformat (%s) automatiskt kommer att användas." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Omslagsbilder från internet" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Omslag kan hämtas ner från Internet, baserat på taggarna för det aktuella " "spåret. Du kan ange att alltid föredra användarens egna omslag istället för " "de från Internet. Om ett användaromslag, i detta fall, redan finns för det " "aktuella spåret så kommer det att användas. Om det inte redan finns så " "kommer det att hämtas." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Statusfil" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Generera en textfil med aktuell status" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Sökvägen till den markerade filen är inte giltig. Välj en befintlig sökväg." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Välj en fil" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Denna modul genererar en textfil med information om spåret som spelas upp." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Anpassa filen" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Du kan ändra innehållet i filen till valfri text. Innan filen genereras " "kommer fälten i formuläret {field} att ersättas av motsvarande värden. " "Tillgängliga fält är:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Diverse" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Cd-rom-enhet:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Töm cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Hämta skivinformation" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Hämta skivinformation från en databas på nätet" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Plats för din cd-rom-enhet" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Ta bort all skivinformation från din hårddisk" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Spara skivinformation på din hårddisk" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Spara information i en lokal cache" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Lägg till i spellista" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Lägg till markering till spellistan" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Ersätt spellistan med markeringen och starta uppspelning" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Sök igenom ljudskivan igen" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Lösenord:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Kom ihåg detta lösenord" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Användarnamn:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etikett" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Omslagsbilder från internet" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Lokala omslagsbilder" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Använd lokala omslagsbilder i första hand" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" "Hämta inte omslagsbilder från internet om det finns en lokal omslagsbild" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Hämta omslagsbilder" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Filnamn att leta efter (t.ex. mapp, omslagsbilder)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Filnamn:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Försök hämta omslagsbilder från internet" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Text" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titel" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Tidsgräns för notifiering:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Visa en \"hoppa över spår\"-knapp" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Tid under vilken notiferingen visas" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "sekunder" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Rotmappar" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Lägg till en ny rotmapp till filutforskaren" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Ta bort de markerade rotmapparna" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Byt namn" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Byt namn på markerad rotmapp" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Huruvida dolda filer ska visas i filutforskaren" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Bortstädade ord" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Vid stopp eller avslut" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Gör ingenting" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Meddelande:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Ställ in status till:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Uppdatera även om inte tillgänglig" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Uppdatera när pausad" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Uppdatera din status även om du är markerad som inte tillgänglig" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Uppdatera din status vid paus/fortsätt" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotek" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Lägg till ett nytt bibliotek" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Ta bort markerade bibliotek" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Byt namn på markerat bibliotek" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" "Uppdatera det markerade biblioteket genom att söka igenom disken igen" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Töm" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Töm spellistan" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Visa dialogrutan Om" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Visningsinställningar" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Förfluten tid" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_Hjälp på nätet" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Öppna webbsidan för hjälp" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Spela upp alla spår utan stopp" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Spela upp nästa spår" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Spela upp föregående spår" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Avsluta programmet" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Återstående tid" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Spola till en position i aktuellt spår" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Välj en utforskare" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Blanda" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Blanda spellistan" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Stoppa aktuellt spår" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Redigera" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fil" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Hjälp" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Namn:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Sökväg:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fil" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Uppspelningsstatus" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Spela upp/Fortsätt" ./decibel-audio-player-1.06/po/ro.po0000644000175000017500000010001211456551414017355 0ustar ingelresingelres# Romanian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-12-25 21:20+0000\n" "Last-Translator: Cosmin Stremţan \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Numărul piesei" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titlu" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artist:" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Gen muzical" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Dată" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Discul cu numărul" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Durata în secunde" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Durata sub formă de string (de ex. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Poziția piesei în listă" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Numărul de piese în listă" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Calea completă a fişierului" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disc %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Gen necunoscut" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Titlu necunoscut" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Album necunoscut" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artist necunoscut" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Artist necunoscut" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Adi Roiban https://launchpad.net/~adiroiban\n" " Cosmin Stremţan https://launchpad.net/~cosmin-stremtan" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Dezvoltator" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Mulţumiri către:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Introduceţi numele şi parola Dvs.pentru\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Parolă obligatorie" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Despre stocarea în siguranţă a parolei" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Dacă folosiți GNOME, este indicată stocare parolei, având în vedere că " "utilizați inelul de chei Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Dacă nu folosiţi GNOME, trebuie sa ţineţi cont de faptul că, deşi parola nu " "este stocată sub formă de text, un atacator ar putea să o acceseze" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferinţe" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Acest modul nu poate fi încărcat" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Module" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descriere" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "În acest meniu puteți găsi o lista completă a modulelor, adică bucăți de cod " "care adaugă diverse funcții aplicației. Puteți activa/dezactiva un modul " "prin selectarea/deselectarea casuței corespunzătoare. Unele module (ex. " "File Explorer) nu pot fi dezactivate." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configurarea unui modul" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Cînd un anumit modul poate fi configurat, un icon este afișat în partea " "dreaptă. Ca să configurați un modul, selectați-l printr-un simplu clic si " "apoi apasați pe butonul ”Preferințe” din partea de jos a meniului. Un modul " "poate fi configurat doar în momentul în care este activat." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Alegeți un dosar" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Această cale nu există" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Vă rugăm selectaţi un director existent." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Acest nume este incorect" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Acest nume nu este permis.\n" "Vă rugăm să folosiţi un alt nume." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Simbolul %s nu este permis.\n" "Vă rugăm să folosiţi un alt nume." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Statutul mesageriei instant" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Aduceţi la zi mesajul de intampinare al clientului Dvs. de IMstatus" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Aplicaţia Decibel este oprită" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [paused]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Acest modul detectează orice program de mesagerie instantă şi aduce la zi " "status-ul Dvs., cu privire la piesa pe care o ascultaţi. Programele de " "mesagerie suportante sînt:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Peronalizaţi mesajul \"status\"" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Puteți adauga status-ului Dvs orice text doriți. Înainte de a-l activa, " "modulul înlocuiește toate cîmpurile din formularul {field} cu valorile " "corespunzătoare. Cîmpurile valabile sînt:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Marcaj" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Pentru formatare textului se poate folosi programul Pango. Mai multe " "informații despre acest limbaj pot fi găsite pe paginile următoare:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Curăţare" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Păstrează-ţi actualizat profilul Lasf.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Contul tău Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pauză]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Următoarele module Python nu sunt disponibile:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Acestea trebuie instalate pentru a putea activa acest modul" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notificare pe desktop" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Afişează o notificare pe desktop in momentul schimbării piesei" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Ignoră piesa" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Acest modul permite afişarea unei ferestre de tip pop-up pe desktop în " "momentul schimbării piesei" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Personalizează stilul notificării" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Titlul și corpul notificării pot fii schimbate cu orice text doriți. Înainte " "de afișarea ferestrei pop-up, cîmpurile din formularul {field} sînt " "înlocuite cu valorile corespunzătoare. Cîmpurile disponibile sînt:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Rapaus piesa curentă" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Rulează prima piesă din lista de piese" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continuă să rulezi piesa curentă" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Durată" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Salvează lista de piese" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Decupare" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Repetă" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Salvează lista de piese ca..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Caută în sistemul de fişiere" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Acasă" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "se încarcă..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Afișează fișierele ascunse" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Acest fişier rădăcină va putea fi adaugat ulterior" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Înlătura intrarea selectată" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Aceste fişiere rădăcină vor putea fi adaugate ulterior" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Înlătur toate intrările selectate?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Fişierele tale media nu vor fi şterse" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Acest modul permite căutarea de fişiere aflate pe drive" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Utilizare" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Este necesară adăugarea a cel puțin unui director rădăcină pentru a putea " "căuta în fișiere. Acest director va deveni rădăcina exploratorului de " "fișiere din fereastra principală." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Colecţie" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" "Organizează-ţi colecţia muzicală în funcţie de etichete, nu de fişiere" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Colecţia se crează" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Colecţia se re-încarcă" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Se caută fișiere media în director. Această operație poate să dureze." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Colecţia se crează..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Reîmprospătare colecţie" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "piese" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Această colecţie poate fi re-creată ulterior" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Înlătur colecţia selectată?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Aceste colecţii vor putea fi recreate ulterior" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Înlătur toate colecţiile selectate?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Fişierele media nu vor fi înlăturate" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Cînd se adaugă o librărie nouă, este necesar să se precizeze calea completă " "spre directorul rădăcină al acesteia. În acest fel, toate directoarele " "existente în rădăcină vor fi scanate recursiv pentru fișiere media a căror " "etichetă va fi citită și introdusă în baza de date." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Adaugă un icon în zona de notificare" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD audio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Rulează discurile audio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "descărcare date..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Pistă %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Niciun disc nu a fost găsit" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Aceasta va înlătura toate informaţiile referitoare la disc stocate pe hard " "drive" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Şterg memoria tampon CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Cale invalidă" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Calea spre unitatea optică CD-ROM nu este validă. Alegeți o cale existentă, " "vă rog." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Acest modul vă permite să rulați discuri audio direct din unitatea optică CD-" "ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Baza de date cu compact disc-uri (BDCD)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Informații referitoare la disc (ex. numele artistului sau al pistei) pot fi " "descărcate dintr-o bază de date aflată on-line. Pentru a evita descărcarea " "aceleiași informații din nou în momentul redării repetate a pistei, datele " "pot fi stocate pe hard drive." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "de către %(artist)s\n" "de pe %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Coperte" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Arată copertele albumului" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Acest modul afișează coperta albumului de pe care provine piesa curentă., " "Copertele pot fi încărcate din imagini locale, situate în același director " "cu piesa curentă sau pot fi descărcate de pe internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Copertele utilizatorilor" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "O copertă a unui utilizator este o imagine existentă în același director ca " "și piesa curentă. Cînd sînt specificate nume de fișiere, nu este nevoie și " "specificarea extensiilor corespunzătoare; extensiile compatibile (%s) sînt " "utilizate automat." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Coperte de pe internet" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Statut fișier" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Generează un fișier text cu status-ul curent" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Alege un fișier" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Diverse" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Unitate optică CD-ROM" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Şterge memoria tampon" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Descarcă informaţii despre disc" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Descarcă informaţii despre disc folosind o bază de date on-line" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Locația unității optice CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Înlătură toate informaţiile despre disc de pe" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Salvează informamții despre disc pe hard disk" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Slavează informația intr-o memorie tampon locală" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Adaugă în lista de redare" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Adaugă selecția făcută în lista de redare" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Înlocuiește lista de redare cu selecția făcută și pornește redarea" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Scanează din nou discul audio" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Parola:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Memorează această parolă" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Numele utilizatprului" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "Etchetă" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Coperte de pe internet" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Coperte utilizator" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Preferă întotdeauna copertele utilizatorilor" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Nu descărca coperte în cazul în care exista coperta utilizatorului" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Descarcă coperte" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Căutare după nume de fișiere (ex. director, copertă)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Nume de fișiere" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Încearcă descarcarea de coperte de pe internet" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Corp" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titlu" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Afișează un buton ”Omite piesa”" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "Secunde" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Directoare rădăcină" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Adaugă un director rădăcină nou ăn exploratorul de fișiere" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Înlătură directoarele rădăcină selectate" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Redenumește" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Redenumește directorul rădăcină selectat" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" "Dacă se dorește afișarea fișierelor ascunse în exploratorul de fișiere" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Pentru Oprire sau Ieșire" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Nu face nimic" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Mesaj" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Setează status ca:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Actualizează inclusiv cînd nu este disponibil" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Actualizează cînd esre în repaus" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Actualizează status-ul chiar daca sînteți marcat ca indisponibil" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Actualizează status-ul la repaus/pornire" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Librării" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Adăugați o librărie nouă" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Redenumiți librăria selectată" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Actualizează librăria selectată prin scanarea discului" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Șterge" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Șterge lista de redare" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Afișează meniul ”Despre”" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Afișează preferințele" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Timp scurs" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Ajutor Online" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Deschide pagina de ajutor online" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Redă toate piesele fără încetare" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Redă următoarea piesă" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Redă piesa precedentă" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Închide aplicația" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Timp rămas" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Caută o poziție în piesa curentă" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Selectează un explorator de fișiere" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Amestecă" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Amestecă lista de redare" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Oprește piesa curentă" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Modifică" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fişier" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Ajutor" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nume:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Cale:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fișier" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Status Redare" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Redare" ./decibel-audio-player-1.06/po/nn.po0000644000175000017500000007520011456551414017362 0ustar ingelresingelres# Norwegian Nynorsk translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-04-22 07:57+0000\n" "Last-Translator: Jon Stødle \n" "Language-Team: Norwegian Nynorsk \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Spornummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Tittel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artist" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Lengde i sekund (td 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Lengde som streng (td 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Plassen til sporet i spelelista" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Nummer til sporet i spelelista" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Heile stien til fila" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Ukjend album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Ukjend artist" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Jon Stødle https://launchpad.net/~jonstodle" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Utviklar:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "TAkk til:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Passord nødvendig" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Om passordlagringstryggleik" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Om du bruker Gnome er det trygt å lagre passordet sidan Gnome-nykkelringen " "brukes." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Om du ikkje bruker Gnome, ver klar over at ein angripar kan få tak i " "passordet, sjølv om det ikkje er i klartekst." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Instillingar" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Kunne ikkje laste modulen." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Modular" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Skildring" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Denne dialogboksen viser lista over tilgjengelege modular, som er små " "kodesnuttar som legg til funksjonar til programmet. Du kan slå ein modul " "av/på ved å merke/avmerke avmerkingsboksane framføre dei. Merk at nokre " "modular (td filutforskaren) kan ikkje verte skrudd av." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Still inn ein modul" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Når ein modul kan innstillast vert eit eige ikon vist til høgre for den " "gjeldande linja. For å stille inn modulen, treng du berre å velje han og " "klikke på \"Instillingar\"-knappen på botnen av dialogboksen. Merk at å " "stille inn modulen berre er mogleg nå han er slått på." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Vel ei mappe" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Denne stien finnst ikkje" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Vel ei eksisterande mappe." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Namnet er feil" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Namnet er ikkje tillate.\n" "Bruk eit anna." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Teiknet %s er ikkje tillate.\n" "Bruk eit anna namn." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Lynmeldingsstatus" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Oppdater statusmeldinga til IM-klienten din" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel er stoppa" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Denne modulen oppdagar kjørande lynmeldingsprogram og oppdaterer statusen " "din til informasjon om sporet du høyrer på. Støtta klientar er:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Tilpass statusen" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Du kan endre statusen til kva tekst til det du vil. Før modulen endrar han, " "endrar modulen alle felta i skjemaet med deira tilhøyrande verdi: Moglege " "felt er:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Oppmerking" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Du kan bruke Pango oppmerkingsspråk til å formatere teksten. Meir " "informasjon om språket kan du finne på den følgjande vevsida:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Sensurering" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Du kan definere nokre ord som skal sensurerast før dei vert brukt i statusen " "din. I desse tilfella vil bokstavane i midten av orda verte endra til " "asteriskar autmatisk (td \"Metallica - Live S**t Binge & Purge\"). Eit ord " "på kvar linje." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Hald Last.fm profilen din oppdatert" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Last.fm kontoen din" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausa]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Dei følgjande Python-modulane er tilgjengelige:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Du må installere dei om du vil slå på denne modulen." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Skrivebordsmelding" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Viser ei skrivebordsmelding når sporet skiftar" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Forbigå spor" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Denne modulen viser eit lite sprettopp-vindauge når eit nytt spor startar." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Tilpass meldinga" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Du kan endre tittelen og hovudteksten til meldinga til kva som helst tekst. " "Før sprettopp-vindauget vert vist vil felta i skjemaet verte bytta ut med " "dei tilsvarande verdiane. Tilgjengelige felt er:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pause sporet" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Spel fyrste sporet i spelelista" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Hald fram med å spele sporet" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Vel ein utforskar\n" "i valboksen nedanfor." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Lengde" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Lagre speleliste" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Klipp" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Gjenta" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Lagre speleliste som..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Filutforskar" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Bla gjennom filsystemet" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Heim" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Vis gøymde filer" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Du kan leggje til denne rotmappa seinare om du har lyst til det." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Fjerne den valde oppføringa?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Du kan leggje til desse rotmappene seinare om du har lyst til det." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Fjerne alle valde oppføringar?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Mediafilene vil ikkje verte sletta." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Denne modulen lar deg bla gjennom filene på diskane dine." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Bruk" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Minst ei rotmappe må verte lagd til for å bla gjennom filene. Denne mappa " "vert rotmappa til filutforskartreet i hovudvindauget." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliotek" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organiser musikken etter merkelappar" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Lagar bibliotek" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Oppdaterar bibliotek" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Mappa vert søkt gjennom etter mediafiler. Dette kan ta litt tid.\n" "Vent litt." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Lagar bibliotek..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Oppdaterar bibliotek..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "spor" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Du kan lage dette biblioteket på ny seinare om du har lyst." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Fjerne det velde biblioteket?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Du kan lage desse biblioteka på ny seinare om du har lyst." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Fjern alle velde bibliotek?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Mediafilene kan ikkje verte fjerna." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Denne modulen organiserer mediafilene etter merkelappar i staden for etter " "mappestruktur. Lasting av spor vil òg verte raskare sidan merkelappen er " "allereie kjend og treng ikkje lesast på ny." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Når du legg til eit nytt bibliotek må du oppgje heile stien til rotmappa til " "biblioteket. Då vil alle mappene i denne rotmappa verte søkt gjennom fleire " "gongar for mediafiler og merkelappane vil verte lest og lagra i ein database." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Når eit bibliotek vert oppdatert vil filstrukturen i rotmappa og alle " "mediafiler verte søkt gjennom for endringar, for å oppdatere databasen." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Statusikon" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Legg til eit ikon i systemkurva" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Lyd-CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Spel lyddiskar" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "lastar ned data..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Ingen disk funne" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "Dette vil fjerne all diskinformasjon lagra på harddisken din." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Rense CDDB-cache?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Feil i sti" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "Stien til CD-ROM-en er ikkje riktig. Vel ein eksisterande sti." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "Denne modulen lar deg spele lyddiskar frå CD-ROM-en." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc-DataBase" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Diskinformasjon, som artist og albumtittel, kan verte lasta ned automatisk " "fra ein database på veven om ynskjar det. Denne informasjonen kan òg lagrast " "på harddisken din for avverge at han vert lasta ned på nytt neste gong " "disken vert spelt." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Statusfil" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Generer ei tekstfil med gjeldande status" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "Stien til den valde fila er ikkje gyldig. Vel ein eksisterande sti." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Vel ei fil" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Denne modulen lagar ei tekstfil med omsyn til sporet som vert spelt av." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Tilpassing av fila" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Du kan endre innhaldet i fila til kva tekst du vil. Før fil vert laga vil " "felta i skjemaet verte bytta ut med deira tilhøyrande verdi. Dei " "tilgjengelige felta er:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Forskjellig" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Rens cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Last ned diskinformasjon" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Last ned diskinformasjon fra ein database på veven" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Plassering av CD-ROM-en" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Fjern alt diskinformasjon lagra på harddisken din" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Lagre diskinformasjon på harddisken din" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Lagre informasjonen i lokal cache" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Legg til i speleliste" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Legg til val i spelelista" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Bytt ut spelelista med valet og start å spele" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Skann lyddisk på ny" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Passord:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Hugs dette passordet" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Brukarnamn:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "segl" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Kropp" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Tittel" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Meldingstidsavbrot:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Vis ein \"Hopp over\"-knapp" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Tid som meldingen skal visast" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "sekund" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Rotmapper" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Legg til ei ny rotmappe i filutforskaren" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Fjern dei valde rotmappene" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Gje nytt namn" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Gje nytt namn til valde rotmapper" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Avgjer om gøymde filer skal verte vist i filutforskaren" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Sensurerte ord" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Ved stopping eller avslutting" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Ikkje gjer noko" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Melding:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Set status til:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Oppdater sjølv om utilgjengelig" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Oppdater når pausa" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Oppdater statusen din sjølv om du er merka som utilgjengelig" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Oppdater statusen ved pause-/spel-hendingar" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotek" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Legg til bibliotek" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Fjern dei valde bibliotek" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Gje nytt namn til valde bibliotek" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Oppdater valde bibliotek ved å søke gjennom disken" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Rens" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Rens spelelista" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Vis om-dialogboks" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Vis instillingar" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tid gått" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_Hjelp på veven" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Opne hjelpesida på veven" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Spel alle spor utan stopp" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Spel neste spor" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Spel førre spor" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Avslutt programmet" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tid att" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Søk etter stad i gjeldande spor" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Vel ein utforskar" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Tilfeldig" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Tilfeldig i spelelista" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Stop gjelande spor" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Rediger" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fil" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Hjelp" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Namn:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Sti:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fil" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Spelestatus" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Spel7hald fram" ./decibel-audio-player-1.06/po/ru.po0000644000175000017500000012347211456551414017402 0ustar ingelresingelres# Russian translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-11-07 12:29+0000\n" "Last-Translator: Sergey Ivanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Language: Russian\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Номер дорожки" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Название" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Исполнитель" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Альбом" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Жанр" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Дата" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Номер диска" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Продолжительность в секундах (например, 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Продолжительность (например, 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Положение композиции в списке воспроизведения" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Количество композиций в списке воспроизведения" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Полный путь к файлу" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Диск %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Неизвестный жанр" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Неизвестное название" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Неизвестный альбом" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Неизвестный исполнитель" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Неизвестный альбом" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Anton Shestakov https://launchpad.net/~engored\n" " Artem Urvanov https://launchpad.net/~artem62\n" " Sergey Ivanov https://launchpad.net/~rus-patriot\n" " Tirukill https://launchpad.net/~tirukill\n" " virtoo https://launchpad.net/~virtoo" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Разработчик:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Благодарности:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Введите имя пользователя и пароль для\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Требуется пароль" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "О безопасности хранения паролей" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Если вы используете Gnome, сохранять ваши пароли — безопасно, так как в этом " "случае используются брелоки Gnome (Gnome Keyrings)." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Если вы не используете Gnome, остерегайтесь этого. Конечно, пароли не " "сохраняются в виде обычного текста, но, тем не менее, злоумышленник " "может получить ваш пароль." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Параметры" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Не удалось загрузить данный модуль." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Модули" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Описание" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Это окно отображает список доступных модулей, которые добавляют новые " "возможности приложению. Вы можете включить/отключить модуль, поставив/убрав " "галочку напротив него. Заметьте, что некоторые модули (например, " "Обозреватель файлов) не могут быть отключены." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Настройка модулей" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Когда модуль имеет собственные настройки, справа от модуля показывается " "особый значок. Чтобы настроить модуль, просто выберите его и нажмите кнопку " "«Параметры», которая расположена внизу диалогового окна." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Выберите папку" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Указанный путь не существует" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Выберите существующую папку." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Неправильное имя" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Использовать данное имя не разрешено.\n" "Выберите другое." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Использовать символ %s не разрешено.\n" "Выберите другое имя." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Сообщение о статусе" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" "Обновляет сообщение о статусе в клиенте обмена мгновенными сообщениями" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Проигрыватель остановлен" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [приостановлено]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Данный модуль определяет любой запущенный клиент обмена мгновенными " "сообщениями и указывает в сообщении о статусе название композиции, которую " "вы слушаете. Поддерживаются следующие клиенты:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Настройка сообщения" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Вы можете выбрать любой текст в качестве сообщения. Перед тем, как " "отобразить ваш текст, модуль заменяет все поля вида {поле} их " "соответствующими значениями. Доступны следующие поля:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Разметка" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Вы можете использовать язык разметки Pango для форматирования текста. " "Дополнительная информация доступна на следующем веб-сайте:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Цензура" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Вы можете определить слова, которые будут подвергнуты фильтрации при их " "отображении в сообщении о статусе. В этом случае, буквы в середине слова " "будут заменены звёздочками (например, «Ленинград — Маде Ин Ж**а»). Вводите " "каждое слово на новой строке." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Обновляет ваш профиль пользователя на Last.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "учётной записи Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "%(count)u композиция в списке воспроизведения [%(length)s]" msgstr[1] "%(count)u композиции в списке воспроизведения [%(length)s]" msgstr[2] "%(count)u композиций в списке воспроизведения [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[приостановлено]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Следующие модули Python требуются, но не доступны:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Вам нужно установить их, если вы хотите использовать этот модуль." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Уведомления на рабочем столе" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Отображает уведомления на рабочем столе при смене композиции" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Пропустить композицию" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Этот модуль отображает небольшое всплывающее окно на вашем рабочем столе, " "когда начинает играть следующая композиция." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Параметры уведомлений" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Вы можете использовать любой текст в качестве заголовка и тела уведомления. " "Перед тем, как отобразить всплывающее окно, модуль заменяет все поля вида " "{поле} их соответствующими значениями. Доступны следующие поля:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Приостановить воспроизведение текущей композиции" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Воспроизвести первую композицию из списка воспроизведения" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Продолжить воспроизведение текущей композиции" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Выберите режим просмотра\n" "вашей музыкальной коллекции\n" "в раскрывающемся списке ниже" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Время" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Сохранить список воспроизведения" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Обрезать" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Повторять" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Сохранить список воспроизведения как..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Обозреватель файлов" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Позволяет просматривать файлы и папки" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Домашняя папка" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "загрузка..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Показывать скрытые файлы" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Вы сможете добавить эту корневую папку позже, если пожелаете." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Убрать выделенное?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Вы сможете добавить эти корневые папки позже, если пожелаете." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Убрать выделенное?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Ваши файлы не будут удалены." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Этот модуль позволяет вам просматривать файлы и папки на вашем компьютере." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Использование" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Для того, чтобы просмотреть файлы, вам необходимо выбрать хотя бы одну " "корневую папку. После этого указанная папка послужит корнем дерева файлов в " "главном окне." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Фонотека" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Лёгкий доступ к вашим композициям по тегам, вместо названий файлов" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Создание фонотеки" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Обновление фонотеки" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Папка просматривается на наличие звуковых файлов. Это может занять некоторое " "время.\n" "Пожалуйста, подождите." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Сканирование папок (найдена %(nbtracks)u дорожка)" msgstr[1] "Сканирование папок (найдены %(nbtracks)u дорожки)" msgstr[2] "Сканирование папок (найдено %(nbtracks)u дорожек)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Создание фонотеки..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Обновление фонотеки..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Фонотека устарела, обновите её." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "композиций" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Вы сможете создать эту фонотеку заново позднее, если пожелаете." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Удалить выбранную фонотеку?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Вы сможете создать эти фонотеки заново позднее, если пожелаете." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Удалить все выбранные фонотеки?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Ваши файлы не будут удалены." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Этот модуль позволяет получить доступ к вашей музыку по тегам (например, по " "исполнителю или названию альбома), не используя структуру файлов вашего " "компьютера. Загрузка композиций происходит быстрее, за счёт того, что их " "теги уже известны, и нет необходимости считывать данные заново." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Когда вы добавляете новую фонотеку, вам необходимо указать полный путь к " "главной папке вашей фонотеки. Затем будет произведён поиск звуковых файлов в " "этой папке и во всех её вложенных папках. Теги композиций будут занесены в " "базу данных." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "При обновлении фонотеки, главная папка и все вложенные папки будут " "просмотрены на наличие изменённых или новых файлов. После этого база данных " "будет изменена соответствующим образом, чтобы отразить произошедшие " "изменения." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Значок состояния" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Добавляет значок в область уведомлений" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [приостановлено]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Звуковые компакт-диски" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Поддержка воспроизведения звуковых компакт-дисков" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "загрузка данных..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Трек %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Диск не найден" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "Это удалит всю информацию о компакт-дисках с вашего компьютера." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Очистить кэш CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Неверный путь" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "Неверный путь к устройству CD-ROM. Укажите правильный." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Этот модуль позволяет проигрывать звуковые компакт-диски с вашего устройства " "CD-ROM" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "База данных компакт-дисков (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Информация о диске, такая как, например, исполнитель и название альбома, " "может быть загружена автоматически из Интернета, если вы пожелаете. Эта " "информация может быть также сохранена на вашем компьютере для повторного " "использования." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "в исполнении %(artist)s\n" "из альбома %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Обложки" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Показ обложек альбомов" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Данный модуль отображает обложку альбома воспроизводимой композиции. Обложки " "могут быть локальными изображениями, расположенными в одной папке с " "композицией, либо они могут быть получены из Интернета." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Локальные обложки" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Локальная обложка — это изображение, расположенное в той же папке, что и " "текущая композиция. При указании имён файлов не следует указывать " "расширение; поддерживаемые форматы (%s) будут распознаны автоматически." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Интернет-обложки" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Обложки могут быть загружены через Интернет, основываясь на тегах " "композиции. Есть возможность предпочтения локальных обложек загружаемым. В " "таком случае будет использоваться локальная обложка, если таковая найдена; " "иначе же обложка будет загружена из Интернета." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Файл состояния" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Создаёт текстовый файл с информацией о состоянии" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "Был указан неправильный путь к файлу. Укажите подходящий путь." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Выберите файл" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Этот модуль создаёт файл с информацией о композиции, которая воспроизводится " "в данный момент." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Параметры файла" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Вы можете использовать любой текст в качестве содержания файла. Перед " "записью в файл, модуль заменяет все поля вида {поле} их соответствующими " "значениями. Доступны следующие поля:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Дополнительно" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Устройство CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Очистить кэш" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Загрузить информацию о компакт-диске" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Загрузить информацию о компакт-диске из базы данных в Интернете" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Расположение устройства CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Удалить всю информацию о компакт-диске с компьютера" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Сохранить информацию о компакт-диске на компьютере" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Сохранить информацию в локальном кэше" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Добавить в список воспроизведения" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Добавить выделенное в список воспроизведения" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" "Заменить текущий список воспроизведения выбранными композициями и начать " "воспроизведение" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Сканировать звуковой компакт-диск заново" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Пароль:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Запомнить этот пароль" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Имя пользователя:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "ярлык" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Интернет-обложки" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Локальные обложки" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Предпочитать локальные" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Не загружать обложку, если уже найдена локальная" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Загрузить обложки" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Имена для поиска (например, «folder, cover»)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Имена файлов:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Загружать обложки из Интернета" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Тело" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Заголовок" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Время отображения уведомлений:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Показывать кнопку «Пропустить композицию»" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Время, в течение которого будут отображаться уведомления" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "секунд(ы)" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Корневые папки" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Добавить новую корневую папку в Обозреватель файлов" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Удалить выделенные корневые папки" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Переименовать" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Переименовать выбранную корневую папку" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Следует ли показывать скрытые файлы в Обозревателе файлов" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Непристойные слова" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Статус" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Когда остановлено" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Ничего не делать" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Сообщение:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Установить статус:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Обновлять, если недоступен" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Обновлять, если приостановлено" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" "Обновлять сообщение о статусе, даже если вы отсутствуете на своём месте" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" "Обновлять сообщение о статусе, когда воспроизведение " "приостанавливается/продолжается" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Фонотеки" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Добавить новую фонотеку" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Удалить выбранные фонотеки" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Переименовать выбранную фонотеку" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Сканировать и обновить выбранную фонотеку" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Очистить" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Очистить список воспроизведения" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Показать окно «О программе»" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Показать параметры" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Пройденное время" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_Справка в сети" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Перейти на веб-сайт со справкой по программе" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Воспроизводить все композиции бесконечно" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Воспроизвести следующую композицию" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Воспроизвести предыдущую композицию" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Выйти из программы" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Оставшееся время" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Ползунок навигации в воспроизводимой композиции" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Выберите режим просмотра" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Перемешать" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Перемешать список воспроизведения" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Остановить воспроизведение" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Правка" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Файл" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Справка" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Имя:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Путь:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Файл" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Формат вывода" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Начать/Продолжить воспроизведение" ./decibel-audio-player-1.06/po/he.po0000644000175000017500000011004611456551414017341 0ustar ingelresingelres# Hebrew translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-11-08 12:03+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "מספר הרצועה" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "כותרת" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "אמן" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "אלבום" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "סגנון" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "תאריך" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "מספר התקליטור" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "משך בשניות (למשל 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "משך כמחרוזת (למשל 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "מיקום הרצועה ברשימת‏־ההשמעה" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "מספר הרצועות ברשימת-השמעה" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "הנתיב המלא אל הקובץ" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [תקליטור %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "סגנון לא ידוע" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "כותרת לא ידועה" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "אלבום לא ידוע" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "אמן לא ידוע" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "אמן התקליטור אינו ידוע" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Alex Let https://launchpad.net/~lolikas\n" " Yaron https://launchpad.net/~sh-yaron" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "מפתח:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "תודות ל:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "הזן את שם המשתמש והסיסמה שלך עבור\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "נדרשת סיסמה" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "אודות אבטחה בשמירת סיסמאות" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "במידה והנך משתמש ב־GNOME, תוכל לשמור סיסמאות בבטחה כיוון שהפעולה מתבצעת דרך " "מחזיק המפתחות של GNOME." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "במידה ואינך משתמש ב־GNOME, היה ער לעובדה כי למרות שהסיסמה אינה נשמרת כטקסט " "מובהק, מפצח סיסמאות יוכל לאחזר אותה." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "העדפות" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "לא ניתן לטעון מודול זה." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "מודולים" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "תיאור" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "בתיבת דו שיח זו מוצגים המודולים הזמינים, אשר הינם חלקים קטנים של קוד " "המוסיפים תכונות נוספות ליישום. ניתן לבטל/להפעיל מודול על ידי סימון/ביטול " "הסימון בתיבת הסימון שלפניו. שימו לב שלא ניתן לבטל כמה מהמודולים (לדוגמה: " "סייר הקבצים)." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "הגדרת מודול" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "כאשר מודול ניתן להגדרה, מוצג סמל לימין השורה התואמת. על מנת להגדיר מודול, " "פשוט בחרו אותו ולחצו על הלחצן \"העדפות\" בתחתית תיבת הדו-שיח. שימו לב שהגדרת " "מודול אפשרית רק כאשר הוא פעיל." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "בחר תיקייה" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "נתיב זה אינו קיים" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "נא בחרו בתיקייה קיימת." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "השם אינו נכון" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "אין להשתמש בשם זה\n" "נא בחרו באחד אחר." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "אין להשתמש בתו %s.\n" "נא בחרו בשם אחר." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "מצב תוכנת המסרים המידיים" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "עדכן את הודעת המצב בתוכנת המסרים שלך" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "הנגן דציבל נעצר" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [מושהה]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "מודול זה מאתר תוכנות מסרים מידיים ומעדכנת את הודעת המצב בהתאם לרצועה אליה " "אתם מאזינים. תוכנות המסרים הנתמכות הן:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "התאמת הודעת המצב" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "תוכלו להגדיר את הודעת המצב לכל טקסט בו תחפצו. לפני הגדרת הטקסט, המודול מחליף " "את כל השדות שצורתם {שדה} בערכם התואם. השדות הזמינים הינם:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "סימון" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "תוכלו להשתמש בשפת הסימון Pango כדי לעצב את הטקסט. מידע נוסף אודות שפה זו " "זמין בכתובת:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "חיטוי" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "תוכלו לבחור מספר מילים שיעברו \"חיטוי\" לפני שישמשו כחלק מהודעת המצב שלך. " "במקרה זה, האותיות המרכזיות של המילים התואמות יוחלפו בכוכביות (לדוגמה: \"הדג " "נחש - היא מקבלת ז*ן\"). הזינו מילה אחת לשורה." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "שמור על פרופיל ה־Last.fm שלך עדכני" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "חשבונך ב־Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "רצועה אחת ברשימת ההשמעה [%(length)s]" msgstr[1] "%(count)u רצועות ברשימת ההשמעה [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[מושהה]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "המודולים הבאים של Python אינם זמינים:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "עליכם להתקין אותם אם ברצונכם להפעיל מודול זה." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "התראות שולחן העבודה" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "הצג התראה בשולחן העבודה עם שינוי רצועת השמע" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "דלג על רצועה" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "מודול זה מציג חלונית קטנה על גבי שולחן העבודה כאשר מתנגנת רצועה חדשה." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "התאמת ההתראה" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "ניתן לשנות את הכותרת ואת גוף ההתראה לכל טקסט בו תחפוץ. לפני הצגת החלונית, " "שדות שצורתם {שדה} יוחלפו בערכם התואם. שדות אפשריים הינם:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "השהה את הרצועה הנוכחית" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "נגן את הרצועה הראשונה ברשימת ההשמעה" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "המשך לנגן את הרצועה הנוכחית" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "נא בחרו סייר\n" "בתיבת הבחירה שלהלן." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "משך" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "שמור את רשימת־ההשמעה" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "חיתוך" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "חזור" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "שמור את רשימת ההשמעה בשם..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "סייר הקבצים" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "סייר במערכת הקבצים שלך" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "דף הבית" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "טוען..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "הצג קבצים מוסתרים" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "תוכל להוסיף את תיקיית משתמש העל הזו שוב אם ברצונך לעשות כך." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "האם להסיר את הרשומה הנבחרת?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "תוכל להשתמש בתיקיות משתמש על אלו מאוחר יותר אם תחפוץ בכך." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "האם להסיר את הרשומות הנבחרות?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "קבצי המדיה שלך לא ימחקו." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "מודול זה מאפשר לך לסייר בין הקבצים שבכונן שלך." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "שימוש" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "יש להוסיף לפחות תיקיית על אחת כדי לסייר בין הקבצים שלך. תיקייה זו תהפוך " "לתיקיית השורש של סייר הקבצים בחלון הראשי." #: ../src/modules/Library.py:30 msgid "Library" msgstr "ספרייה" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "סדר את המוסיקה שלך לפי תגיות במקום קבצים" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "יוצר ספרייה" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "מרענן ספרייה" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "התיקייה נסרקת אחר קבצי מדיה. פעולה זו עלולה לארוך זמן מה.\n" "אנא המתן." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "סורק תיקיות (נמצאה רצועה אחת)" msgstr[1] "סורק תיקיות (%(nbtracks)u רצועות נמצאו)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "יוצר ספרייה..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "מרענן את הספרייה..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "ספריה זו אינה עדכנית, אנא רענן אותה." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "רצועות" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "תוכל ליצור ספרייה זו שוב מאוחר יותר אם תחפוץ בכך." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "האם להסיר את הספרייה הנבחרת?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "תוכל ליצור תיקיות אלו מחדש מאוחר יותר אם תחפוץ בכך." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "האם להסיר את כל התיקיות הנבחרות?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "קבצי המדיה שלכם לא יוסרו." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "מודול זה מארגן את קבצי המדיה שלך במקום להשתמש במבנה הקבצים של הכונן. טעינת " "הרצועות מהירה יותר כיוון שתגיותיהן כבר ידועות ואין צורך לקרוא אותן שוב." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "בעת הוספת ספרייה חדשה, יהיה עליך לציין את הנתיב המלא מתיקיית העל של ספרייה " "זו. ואז, כל התיקיות תחת נתיב תיקיית על זו יסרקו באופן נסוג עבור קבצי מדיה " "אשר תגיותיהם נקראים ונשמרים במסד נתונים." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "בעת רענון ספרייה, מבנה הקבצים תחת תיקיית העל וכל קבצי המדיה נסרקים אחר " "שינויים, על מנת לעדכן את מסד התונים בהתאם." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "סמל המצב" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "הוסף סמל לאזור ההתרעות" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [מושהה]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "תקליטור שמע" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "נגן תקליטורי שמע" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "מוריד נתונים..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "רצועה %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "לא נמצא תקליטור" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "פעולה זו תסיר את כל נתוני התקליטור המאוחסנים בכונן הקשיח שלך." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "לנקות את מטמון ה־CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "נתיב שגוי" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "הנתיב את התקן כונן התקליטורים הינו שגוי. אנא בחר בנתיב קיים." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "מודול זה מאפשר לך להשמיע תקליטורי שמע מכונן התקליטורים שלך." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "מסד נתוני תקליטורי השמע (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "נתוני התקליטור, כגון אמן וכותרת האלבום, ניתנים להורדה אוטומטית ממסד נתונים " "מקוון במידת הרצון. נתונים אלו עלולים להשמר על הכונן הקשיח שלך כדי להמנע " "מהורדה חוזרת בהשמעה הבאה של אותו התקליטור." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "על ידי %(artist)s\n" "מהאלבום %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "עטיפות" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "הצג עטיפות אלבומים" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "מודול זה מציג את עטיפת האלבום ממנו מגיעה הרצועה הנוכחית. ניתן לטעון עטיפות " "מתמונות מקומיות, הממוקמות באותה התיקייה כמו הרצועה הנוכחית, או ניתנות להורדה " "מהאינטרנט." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "עטיפות המשתמש" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "עטיפת משתמש הינה תמונה הממוקמת באותה התיקייה כמו הרצועה הנוכחית. בעת ציון " "שמות הקבצים, לא תצטרך לספק סיומות קבצים, נעשה שימוש בסוגי קבצים נתמכים (%s) " "אוטומטית." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "עטיפות מהאינטרנט" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "ניתן להוריד עטיפות דרך האינטרנט, בהתבסס על תגיות הרצועה הנוכחית. תוכל תמיד " "לבקש להעדיף להשתמש בעטיפות משתמש על גבי עטיפות אינטרנט. במקרה זה, במידה " "וקיימת עטיפת משתמש עבור הרצועה הנוכחית, בה יעשה שמוש. במידה ואין, העטיפה " "תורד מהאינטרנט." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "קובץ מצב" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "יצר קובץ טקסט עם המצב הנוכחי" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "הנתיב אל הקובץ הנבחר אינו תקני. אנא בחר נתיב קיים." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "בחר קובץ" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "מודול זה מייצר קובץ טקסט תוך התחשבות ברצועה המתנגנת כעת." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "התאמת הקובץ אישית" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "תוכל לשנות את תוכן הקובץ לכל טקסט שתרצה. לפני ייצור הקובץ, השדות מהצורה " "{שדה} מוחלפים בערך התואם להם. השדות הזמינים הינם:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "שונות" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "התקן כונן התקליטורים:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "נקה מטמון" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "הורד את נתוני התקליטור" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "הורדת נתוני התקליטור ממסד נתונים מקוון" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "מיקום התקן כונן התקליטורים שלך" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "הסר את כל נתוני התקליטור מהכונן הקשיח שלך" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "שמור את נתוני התקליטור לכונן הקשיח שלך" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "שמור נתונים במטמון מקומי" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "הוסף לרשימת ההשמעה" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "הוסף את הבחירה לרשימת ההשמעה" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "החלף את רשימת ההשמעה בבחירה והתחל לנגן" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "סרוק מחדש את תקליטור השמע" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "סיסמה:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "זכור סיסמה זאת" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "שם המשתמש:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "תוית" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "עטיפות מהאינטרנט" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "עטיפות משתמש" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "תמיד העדף עטיפות משתמש" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "אל תוריד עטיפות כאשר ישנן עטיפות משתמש" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "הורד עטיפות" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "שמות קבצים לאיתור (לדוגמה: תיקייה, עטיפה)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "שמות הקבצים:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "נסה להוריד עטיפות מהאינטרנט" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "גוף" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "כותרת" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "תפוגת ההתראה:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "הצג לחצן \"דלג על רצועה\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "משך הזמן להצגת ההתראה" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "שניות" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "תיקיות על" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "הוסף תיקיית על חדש לסייר הקבצים" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "הסר את תיקיות העל הנבחרות" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "שנה שם" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "שנה את שם תיקיות העל הנבחרות" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "האם יש להציג קבצים מוסתרים בסייר הקבצים" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "מילים לחיטוי" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "מצב" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "בעת העצירה או היציאה" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "אל תעשה כלום" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "הודעה:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "הגדר את המצב ל־:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "עדכו אפילו באי זמינות" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "עדכן בעת ההשהייה" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "עדכן את המצב שלך גם אם הינך מסומן כלא זמין" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "עדכן את המצב שלך בעת אירועי השהייה/המשך" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "ספריות" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "הוספת ספרייה חדשה" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "הסר את הספריות הנבחרות" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "שנה את שם הספריות הנבחרות" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "עדכן את התיקייה הנוכחית על ידי סריקת הכונן מחדש" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "נקה" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "נקה את רשימת ההשמעה" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "הצג את תיבת האודות" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "הצג את ההעדפות" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "הזמן שחלף" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "עזרה _מקוונת" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "פתח את דפי העזרה המקוונים" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "נגן את כל הרצועות ללא הרף" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "נגן את הרצועה הבאה" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "נגן את הרצועה הקודמת" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "צא מהיישום" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "הזמן שנותר" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "חפש מיקום ברצועה הנוכחית" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "בחר סייר" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "מעורב" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "ערבב את רשימת ההשמעה" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "עצור את הרצועה הנוכחית" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_ערוך" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_קובץ" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "ע_זרה" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "שם:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "נתיב:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "קובץ" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "מצב הניגון" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "נגן/בטל השהייה" ./decibel-audio-player-1.06/po/zh_CN.po0000644000175000017500000007437611456551414017765 0ustar ingelresingelres# Simplified Chinese translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-09-13 16:03+0000\n" "Last-Translator: Aron Xu \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" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "音轨编号" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "歌曲名称" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "艺术家" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "专辑" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "以秒为单位的持续时间(如:194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "字符串形式的持续时间(如:3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "播放列表中的音轨位置" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "播放列表的音轨数" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "文件路径" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "未知专辑" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "未知艺术家" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Aron Xu https://launchpad.net/~happyaron\n" " Peng Deng https://launchpad.net/~d6g\n" " zhuqin https://launchpad.net/~zhuqin" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "开发者:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "鸣谢:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "需要密码" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "关于密码存储的安全性" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "如果你使用Gnome,由于使用了Gnome kerying,存储密码是安全的。" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "如果你不使用Gnome,请注意,尽管非明文存储,密码可能会被黑客获取。" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "首选项" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "无法载入此模块" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "模块" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "描述" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "该对话窗口显示可用模块列表,模块是指为程序增添某些功能的少量代码。你可以通过选择/清除某个模块前面的复选框来激活/禁用它。注意,有一些模块(如文件浏览器)" "无法被禁用。" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "配置一个模块" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "当一个模块可以被配置,在其所在行的右端会显示一个图标。要配置一个模块,先选中它然后单击对话窗口下端的“首选项”按钮。注意,一个模块只有在被激活时才可以被配" "置。" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "选择一个文件夹" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "此路径不存在" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "请选择一个已有的文件夹" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "名称错误" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "该名字禁止使用。\n" "请另选择一个。" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "该符号%s禁止使用。\n" "请另选择一个名字。" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "聊天软件状态" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "更新你的IM客户端的状态信息" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel已停止" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "此模块会检测任何正在运行的即时消息软件并根据你正在听的曲目更新你的状态信息。支持的即时消息软件有:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "自定义状态" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "你可将状态信息设置成为任何你想要的文本。在设置前,该模块会将所有形式为 {field} 的字段替换为对应的值。有效的值为:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "标记" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "你可以使用 Pango 标记语言来格式化文本。更多关于该语言的信息可以从以下网页获取:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "和谐" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "你可在设置状态信息前定义需和谐的单词。匹配的单词的中间部分字符会被自动替换为星号。 (如:\"Metallica - Live S**t Binge & " "Purge\")" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "将你的Last.fm的资料保持最新" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "你的Last.fm帐号" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[暂停]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "下列 Python 模块不可用:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "这些模块需要安装后才能被激活。" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "桌面提示信息" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "在切换音轨时显示桌面提示信息" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "跳过音轨" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "当新的曲目开始播放时,该模块会在桌面上显示一个小的弹出窗口。" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "自定义提示信息" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "你可将提示信息的标题和内容修改为任何想要的文字。在显示弹出窗口前,{field}形式的字段将全被替换为对应的值。可用的字段有:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "暂停当前音轨" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "播放列表中的第一音轨" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "继续播放当前音轨" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "请在下面的组合框中选择一个浏览器。" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "歌曲长度" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "保存播放列表" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "重复播放" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "播放列表另存为..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "文件浏览器" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "浏览你的文件系统" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "主页" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "显示隐藏文件" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "如果你愿意,你可以稍后再添加根文件夹。" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "移除选定的项?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "如果你愿意,你可以稍后再添加这些根文件夹。" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "移除所有选定的项?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "你的媒体文件不会被删除。" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "该模块可以让你浏览驱动器上的文件。" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "用法" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "至少需要添加一个根文件夹来浏览你的文件。该文件夹则成为主窗口内文件浏览器树形目录的根目录。" #: ../src/modules/Library.py:30 msgid "Library" msgstr "媒体库" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "通过标签而不是文件来管理你的音乐" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "创建媒体库" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "刷新媒体库" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "从目录中扫描媒体文件。此过程需要一段时间。\n" "请稍候。" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "正在创建媒体库..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "正在刷新媒体库..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "音轨" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "如果你愿意,该媒体库可在稍后被重建。" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "移除选定的媒体库?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "如果你愿意,这些媒体库可在稍后被重建。" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "移除所有选定的媒体库?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "你的媒体文件不会被移除。" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "该模块通过使用标签而非使用磁盘上文件结构的方式来管理你的媒体文件。由于标签信息已知而不必再次读取,音轨的加载也会更迅速。" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "当添加一个新的媒体库时,你需要提供媒体库根目录的完整路径。此后,会以递归方式从该路径下的所有目录中扫描媒体文件。媒体文件的标签将被读取和储存在数据库中。" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "刷新媒体库时,根目录下的文件结构以及所有的媒体文件都将被扫描改动,使数据库随之更新。" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "状态图标" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "在系统通知区域添加图标" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "音频 CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "播放音频光碟" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "下载数据中..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "未找到光碟" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "这将会删除你硬盘上存储的所有光碟信息" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "清除CDDB缓存?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "无效路径" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "CD-ROM设备的路径无效。请选择一个存在的路径。" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "该模块可以使你从你的CD-ROM设备播放音频光碟" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "CD数据库(CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "光碟信息,如艺术家和专辑标题,如果你愿意,它可以自动从在线数据库下载。该信息可能被保存于你的硬盘,以避免在你下次播放该光碟时重复下载。" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "状态文件" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "生成当前状态的文本文件" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "选定文件的路径无效。请选择一个已存的路径。" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "选择文件" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "该模块根据当前正在播放的音轨生成一个文本文件。" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "自定义文件" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "你可将文件内容修改为任何想要的文本。在文件生成前,形式为{field}的字段将被替换为对应的值。可用的字段有:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "杂项" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM设备:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "清除缓存" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "下载光碟信息" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "从在线数据库下载光碟信息" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "CD-ROM设备的位置" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "从你的硬盘删除所有光碟信息" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "将光碟信息保存到你的硬盘" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "保存信息到本地缓存" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "添加到播放列表" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "添加所选到播放列表" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "用所选替代播放列表并开始回放" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "重新扫描音频光碟" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "口令:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "记住此密码" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "用户名:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "标签" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "标题" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "提示超时:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "显示“跳过音轨”按钮" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "提示显示时间" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "秒" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "根文件夹" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "在文件浏览器中添加一个新的根文件夹" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "移除选定的根文件夹" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "重命名" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "重命名所选的根目录" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "隐藏文件是否显示在文件浏览器中" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "状态" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "何时停止或退出" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "什么也不做" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "消息:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "设置状态为:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "即使不可用仍进行更新" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "当暂停时更新" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "在暂停/恢复时更新你的状态" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "媒体库" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "添加新的媒体库" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "移除选定的媒体库" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "重命名所选的媒体库" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "通过重新扫描磁盘更新选定的媒体库" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "清除" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "清除播放列表" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "显示关于对话窗口" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "显示首选项" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "逝去时间" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "在线帮助(_H)" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "打开在线帮助页面" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "一直播放所有音轨" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "播放下一音轨" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "播放上一音轨" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "退出程序" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "剩余时间" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "跳至当前音轨中的某个位置" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "选择一个浏览器" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "随机播放" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "在播放列表中随机播放" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "停止当前音轨" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "编辑(_E)" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "文件(_F)" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "帮助(_H)" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "名称:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "路径:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "文件" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "播放状态" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "播放/取消暂停" ./decibel-audio-player-1.06/po/Makefile0000644000175000017500000000245011456551414020044 0ustar ingelresingelresINSTALL ?= install PYFILES = $(shell find ../src -type f -name "*.py") GLADEFILES = $(wildcard ../res/*.glade) POFILES = $(wildcard *.po) GLADEHFILES := $(GLADEFILES:.glade=.glade.h) help: @echo "USAGE:" @echo "make update - updates messages.pot and .po files" @echo "make dist - creates .mo files in ../locale dir" @echo "make pl.po - updates pl.po file OR creates new one" @echo " (replace 'pl' with your language code)" %.h: % intltool-extract --type="gettext/glade" $* sed -i '/^char \*s = N_("gtk-.*");$$/d' $@ messages.pot: $(GLADEHFILES) $(PYFILES) xgettext -k_ -kN_ -o messages.pot $(PYFILES) $(GLADEHFILES) --from-code=utf-8 %.po: messages.pot @if test -f $@; then \ echo -n "Updating '$*' language ";\ msgmerge -U $@ messages.pot;\ else \ msginit -l $*.UTF8 -o $@; \ fi %.mo: for pofile in $(patsubst ../locale/%/LC_MESSAGES/decibel-audio-player.mo,%.po,$@); do \ ${INSTALL} -m 755 -d $(subst decibel-audio-player.mo,,$@);\ msgconv -t UTF-8 $${pofile} -o $${pofile}_utf8;\ msgfmt $${pofile}_utf8 -o $@;\ rm $${pofile}_utf8;\ done update: $(POFILES) dist: $(POFILES:%.po=../locale/%/LC_MESSAGES/decibel-audio-player.mo) clean: $(RM) $(GLADEHFILES) $(RM) $(POFILES:%.po=../locale/%/LC_MESSAGES/decibel-audio-player.mo) #$(RM) messages.pot .PHONY: update ./decibel-audio-player-1.06/po/ja.po0000644000175000017500000006115411456551414017344 0ustar ingelresingelres# Japanese translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-04-02 19:28+0000\n" "Last-Translator: Tom Adams \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "トラック番号" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "タイトル" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "演奏者" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "アルバム" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "不明なアルバム" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "不明な演奏者" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Tom Adams https://launchpad.net/~holizz" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "開発者:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "パスワードが必要です" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "設定" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "モジュール" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "説明" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "フォルダの選択" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "このパスは存在しません" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "マークアップ" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[中止]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "プレイリストを保存" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "ホーム" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "隠しファイルを表示" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "使用" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "図書館" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "トラック" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "ファイルを選択" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "キャッシュのクリア" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "プレイリストに追加" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "パスワード:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "パスワードを記憶" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "ユーザ名:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "タイトル" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "秒" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "名前を変更" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "何もしない" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "メッセージ:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "アプリケーションの終了" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "シャッフル" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "編集(_E)" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "ファイル(_F)" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "ヘルプ(_H)" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "名前:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "パス:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "ファイル" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/cs.po0000644000175000017500000006740111456551414017360 0ustar ingelresingelres# Czech translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-05-04 12:48+0000\n" "Last-Translator: Lukáš Zapletal \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Číslo skladby" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Název" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Interpret" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Žánr" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Datum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Číslo disku" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Doba v sekundách (např. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Doba jako text (např. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Pozice skladby v playlistu" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Počet skladeb v playlistu" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Celá cesta k souboru" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Neznámý žánr" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Neznámý název" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Neznámé album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Neznámý iterpret" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Neznámý interpret alba" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Lukáš Zapletal https://launchpad.net/~lzap\n" " joker806 https://launchpad.net/~joker806\n" " vkramar https://launchpad.net/~vaclav-kramar" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Vývojář:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Poděkování:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Vyžadováno heslo" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "O bezpečnosti uložení hesla" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Pokud používáte Gnome, uložení hesla je bezpečné, protože se použije " "klíčenka Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Pokud nepoužíváte Gnome, mějte na paměti, že přesto, že heslo není uloženo " "jako prostý text, útočník ho může získat." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Nastavení" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Nelze načíst tento modul" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduly" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Popis" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Tento dialog obsahuje seznam dostupných modulů, které do aplikace přidávají " "nové funkce. Moduly můžete zapínat/vypínat pouhým zaškrtnutím nebo " "odškrtnutím políčka v řádku. Některé moduly (jako např. Prohlížeč souborů) " "nemohou být vypnuty." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Nastavení modulu" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Pokud má modul možnost nastavení, je to idikováno příslušnou ikonou napravo " "od modulu. Pro nastavení modulu stačí zvolit příslušný modul a klepnout na " "tlačítko \"Nastavení\" vespod okna. Nastavení modulu je možné jen pokud je " "příslušný modul povolený." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Zvolte složku" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Tato cesta neexistuje" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Zvolte prosím existující adresář" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Název je nesprávný" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Tento název není povolen.\n" "Zvolte prosím jiný." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Znak %s není povolen.\n" "Použijte prosím jiný název." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Stav IM" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Aktualizuje status Vašeho IM klienta" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel stojí" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Tento modul detekuje spuštěného IM klienta a nastaví váš status dle " "přehrávané skladby. Podporovaní IM klienti jsou:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Upravuji status" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Můžete použít jazyk Pango markup pro formátování textu. Více informací o " "tomto jazyku je na internetové adrese:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Mějte svůj Last.fm profil aktuální" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "váš Last.fm účet" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pauza]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Následující moduly Pythonu nejsou dostupné:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Pokud chcete aktivovat tento modul, je třeba je nainstalovat." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Upozornění na ploše" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Při změně skladby zobrazí upozornění na ploše uživatele" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Přeskočit skladbu" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Tento modul zobrazí malé vyskakovací okno na vaší pracovní ploše jakmile " "začne nová skladby" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Úprava oznámení" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Můžete změnit nadpis a tělo zobrazované zprávy na cokoli chcete. Před " "samotným zobrazením jsou položky ve formátu {položka} nahrazeny svou " "aktuální hodnotou. Možné položky jsou:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pozastavit přehrávání" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Přehrát první skladu" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Pokračovat v přehrávání" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Prosím zvolte prohlížeč\n" "ve výběru dole." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Délka" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Uložit seznam skladeb" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Prohlížeč souborů" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Procházet soubory" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Domů" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "načítám..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Odstranit vybranou položku?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Odstranit všechny vybrané položky?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Soubory s médii nebudou smazány." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Tento modul vám umožní procházet soubory na vašem disku." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Použití" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Abyste mohli procházet soubory, musí existovat minimálně jedna složka. Tato " "složka se pak stane kořenovou v prohlížeči souborů hlavního okna." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Knihovna" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Zobrazit hudbu podle popisků" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Vytvářím knihovnu" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Obnovuji knihovnu" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Hledám soubory s médii. Tohle může chvilku trvat.\n" "Prosím čekejte." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Vytvářím knihovnu..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Vytvářím knihovnu..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Knihovna není aktuální, prosím, obnovte ji." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "skladba(y)" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" "Budete mít možnost znovu vytvořit tuto knihovnu později, pokud budete chtít." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Odstranit vybranou knihovnu?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" "Budete mít možnost znovu vytvořit tuto knihovnu později, pokud budete chtít." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Odstranit všechny vybrané knihovny?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Vaše soubory s médii nebudou odstraněny." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Tento modul umožňuje organizovat vaše soubory s médii pomocí značek (tags) " "místo adresářů. Nahrávání skladeb je také rychlejší protože jejich značky " "jsou předem známy a není třeba je nahrávat znovu." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Stavová ikona" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Zvukové CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Nenalezen žádný disk" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/nl.po0000644000175000017500000010310511456551414017354 0ustar ingelresingelres# Dutch translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-05-28 10:58+0000\n" "Last-Translator: Robert Wubs \n" "Language-Team: Dutch \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Tracknummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artiest" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genre" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Datum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Schijfnummer" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Duur in seconden (bijv. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Duur als in een string (bijv. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Positie van het nummer in de afspeellijst" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Het aantal nummers in de afspeellijst" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Volledig pad naar het bestand" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Schijf %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Onbekend Genre" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Onbekende Titel" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Onbekend album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Onbekende artiest" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Onbekende Album Artiest" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Joram Pereira https://launchpad.net/~joramrp\n" " Robert Wubs https://launchpad.net/~wubsieonline" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Ontwikkelaar:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Met dank aan:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Voer je gebruikersnaam en wachtwoord in voor\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Wachtwoord vereist" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Over veiligheid van wachtwoordopslag" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Als je Gnome gebruikt, is het veilig om je wachtwoord op te slaan, omdat " "Gnome keyring is gebruikt." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Als je niet Gnome gebruikt, hou er rekening mee dat, ook al niet opgeslagen " "als tekst, een aanvaller het zou kunnen achterhalen." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Voorkeuren" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Niet in staat om deze module te laden" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Modules" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Beschrijving" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Dit dialooogvenster laat een lijst van de beschikbare modules zien, die " "kleine stukjes code zijn, die wat functies toevoegen aan de applicatie. Je " "kan een module in- en uitschakelen door het aan- of afvinken in de checkbox " "er voor. Let op dat sommige modules (bijv. de Bestandsbladeraar) niet kunnen " "worden uitgeschakeld." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configureren van een Module" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Wanneer een module geconfigureerd mag worden, verschijnt een een specifiek " "pictogram aan de rechterkant van de lijn. Om een module te configureren, " "klik simpelweg op de module en klik dan op de \"Voorkeuren\" knop onderaan " "het dialoogvenster. Let op dat het configureren van een module alleen " "mogelijk is wanneer het aan staat." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Kies een map" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Dit pad bestaat niet" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Kies a.u.b. een bestaande map" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "De naam is incorrect" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Deze naam is niet toegestaan.\n" "Gebruik a.u.b. een andere." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Het symbool %s is niet toegestaan.\n" "Gebruik a.u.b. een andere naam." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Instant Messenger Status" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Update het statusbericht van je IM cliënt" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel is gestopt" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [gepauzeerd]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Deze module zoekt naar elke draaiende instant messenger en updates je status " "betreffende het nummer waar je naar luistert. Ondersteunde messengers zijn:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Aanpassen van de Status" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Je kan de status instellen naar elke tekst die je wilt. Voordat je het " "instelt, vervangt de module alle velden van het formulier {field} voor hun " "corresponderende waarde. Verkrijgbare velden zijn:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Opmaak" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Je kan de Pango markup taal gebruiken om de tekst te veranderen. Meer " "informatie over de taal is verkrijgbaar op de volgende webpagina:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Sanitizering" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Je kan aangeven of sommige worden gesanitizeerd moeten worden voordat je ze " "gebruikt in je status. In dit geval, is het middelste karakter van de " "overeenkomstige woorden vervangen voor asterisks (bijv. \"Metallica - Live " "S**t Blinge & Purge\"). Typ 1 woord per zin." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Hou je Last.fm profiel up to date" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "je Last.fm account" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Eén nummer in afspeellijst [%(length)s]" msgstr[1] "%(count)u nummers in afspeellijst [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[gepauzeerd]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Deze Python modules zijn niet verkrijgbaar:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Je moet ze installeren als je deze module wil inschakelen" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Desktopnotificaties" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Laat een desktopnotificatie zien bij nummerverandering" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Sla nummer over" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Deze module laat een klein popup scherm zien op je desktop wanneer een nieuw " "nummer start" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Aanpassen van de notificatie" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Je kan de titel en de body van de notificatie veranderen naar elke die tekst " "je maar wil. Voordat het popup scherm zich laat zien, worden de velden van " "het formulier {field} vervangen voor hun corresponderende waarde. " "Verkrijgbare velden zijn:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pauzeer het huidige nummer" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Speel het eerste nummer van de afspeellijst af" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Ga door met het spelen van het huidige nummer" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Kies a.u.b. een bladeraar\n" "in de combo box hier onder." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Duur" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Afspeellijst opslaan" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Snijden" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Herhalen" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Afspeellijst opslaan als..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Bestandsbladeraar" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Blader in je bestandssysteem" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Persoonlijke map" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "laden...." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Verborgen bestanden tonen" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Je zal in staat zijn om de root map later opnieuw toe te voegen, als je dat " "wil." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Verwijder de geselcteerde invoer" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Je zal in staat zijn om de root map later weer toe te voegen, als je dat wil" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Verwijder alle geselecteerde invoer" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Je mediabestanden zullen niet verwijderd worden" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Deze module staat je toe op door je bestanden te bladeren in je schijven." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Gebruik" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Sowieso 1 root map moet toegevoegd worden om je bestanden te kunnen " "bladeren. Deze map wordt dan de root in de bestandsbladeraar's " "mappenstructuur in het hoofdscherm." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliotheek" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organiseer je muziek door tags in plaats van bestanden" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Maken van bibliotheek" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Verversen van bibliotheek" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "De mappenstructuur wordt gescand voor mediabestanden. Dit kan wat duren.\n" "Wacht a.u.b." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Scannen van mappen (één nummer gevonden)" msgstr[1] "Scannen van mappen (%(nbtracks)u nummers gevonden)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Aanmaken van bibliotheek" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Verversen bibliotheek" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Deze bibliotheek is afgekeurd, hervers het a.u.b." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "nummers" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Je kunt de bibliotheek later opnieuw aanmaken als je dat wil." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Verwijder de geselecteerde bibliotheek?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Je kunt deze bibliotheken later opnieuw aanmaken als je dat wil." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Verwijder alle geselecteerde bibliotheken?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Je mediabestanden zullen niet verwijderd worden." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Deze module organiseert je mediabestanden door tags in plaats van het " "gebruiken van de bestandenstructuur van je schijven. Het laden van nummers " "is ook sneller want de tags zijn al bekend en hoeven niet nog een keer " "gelezen te worden." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Wanneer je een nieuwe bibliotheek toevoegt moet je het volledige pad naar de " "root van die bibliotheek opgeven. Dan worden alle mappen en submappen onder " "de root recursief gescand voor mediabestanden wiens tags gelezen en " "opgeslagen zijn in de database." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Bij het verversen van een bibliotheek, word de hele bestandenstructuur van " "de rootmap gescand en alle mediabestanden gescand op verandering, om de " "database te updaten." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Statuspictogram" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Voeg een icon aan de notificatieruimte toe" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [gepauzeerd]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Audio CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Speel Audio CD's" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "downloaden van data..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Nummer %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Geen schijf gevonden" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Dit zal alle schijfinformatie verwijderen die opgeslagen is op de harde " "schijf." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Wis CDDB cache?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ongeldig pad" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Het pad naar het CD-ROM apparaat is ongeldig. Kies a.u.b. een bestaand pad." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "Deze moudule laat je audio CD's spelen vanaf je CD-ROM apparaat." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc Data Base (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Schijfinformatie, zoals artiest en album titel, kunnen automatisch worden " "gedownload van een online database, als je dat wil. Deze informatie zal ook " "opgeslagen worden op je harde schijf om te voorkomen dat hij het nog een " "keer download bij het opnieuw afpelen van dezelfde cd." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "door %(artist)s\n" "van %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Omslagen" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Laat albumomslagen zien" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Deze module laat de omslag van het album zien waar het huidige nummer " "vandaan komt. Omslagen kunnen geladen worden vanuit lokale plaatjes, die " "geplaatst zijn in dezelfde map als het nummer, of ze kunnen geladen worden " "van het internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Gebruikersomslagen" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Een gebruikersomslag is een plaatje geplaatst in dezelfde map als het " "huidige nummer. Wanneer je een bestandsnaam specificeert, en je voert geen " "bestandsextensie in, dan worden bestandsformaten (%s) automatisch gebruikt." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Internet Omslagen" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Omslagen kunnen gedownload worden van het internet, gebaseerd op de tags van " "het huidige nummer. Je kan aangeven of je liever gebruikersomslagen gebruikt " "in plaats van internetomslagen. In dit geval, als een gebruikersomslag " "bestaat voor het huidige nummer, wordt het gebruikt. Als er geen is, dan " "wordt de omslag gedownload." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Status Bestand" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Genereer een tekstbestand met de huidige status" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Het pad naar het geselecteerde bestand is niet geldig. Kies a.u.b. een " "bestaand pad." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Kies een bestand" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Deze module genereert een tekstbestand betreffende het nummer dat net " "gedraaid is." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Aanpassen van het Bestand" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Je kan de inhoud van het bestand veranderen voor elke tekst die je wil. Voor " "het genereren van dit bestand, worden de velden van dit formulier {field} " "vervangen door de corresponderende waarde, Verkrijgbare velden zijn:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CCDB>" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Overig" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM apparaat;" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Cache legen" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Download schijfinformatie" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Download schijfinformatie van een online database" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Lokatie van je CD-ROM apparaat" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Verwijder alle schijfinformatie van je harde schijf" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Sla schijfinformatie op, op je harde schijf" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Sla informatie op een lokale cache" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Aan afspeellijst toevoegen" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Voeg selectie toe aan de playlist" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Vervang de afspeellijst door de selectie en start playback" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Herscan de audioschijf" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Wachtwoord:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Dit wachtwoord onthouden" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Gebruikersnaam:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "label" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Internet Omslagen" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Gebruikerscovers" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Kies altijd gebruikersomslagen" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Download geen omslagen wanneer er een gebruikersomslag" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Download omslagen" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Bestandsnamen waar naar gezocht moet worden (bijv. map, omslag)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Bestandsnamen:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Probeer covers van het internet te downloaden" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Body" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titel:" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Notificatie timeout:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Laat een 'sla nummer over' knop zien" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Gedurende tijd dat de notificatie word laten zien" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "seconden" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Root Mappen" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Voeg een nieuwe root map toe aan de bestandsbladeraar" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Verwijder de geselecteerde rootmappen" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Hernoemen" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Hernoem de geselecteerde rootmap" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" "Of verborgen bestand moet gezien moeten worden in de bestandsbladeraar" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Gesanitizeerde Woorden" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Bij het stoppen of afslutien" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Niets doen" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Bericht:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Wijzig status in:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Update ook als het niet verkrijgbaar is" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Update wanneer gepauzeerd is" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Update je status zelfs als je op onbeschikbaar staat" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Update je status bij pauze/niet pauze gebeurtenissen" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotheken" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Vopeg een nieuwe bibliotheek toe" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Verwijder de geselecteerde bibliotheken" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Hernoem de geselecteerde bibliotheek" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Update de geslecteerde bibliotheek door het herscannen van je schijf" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Wissen" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Wis de afspeellijst" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Laat het over dialoogvenster zien" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Laat voorkeuren zien" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Verstreken tijd" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Online_Hulp" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Open de online hulp webpagina" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Speel alle nummers oneindig door" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Speel het volgende nummer" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Speel het vorige nummer af" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "De toepassing afsluiten" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tijd over" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Zoek naar een positie in het huidige nummer" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Kies een bestandsbladeraar" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Shuffle" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Shuffle de playlist" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Stop het huidige nummer" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Bewerken" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Bestand" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Help" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Naam:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Pad:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Bestand" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Speelstatus" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Speel" ./decibel-audio-player-1.06/po/hr.po0000644000175000017500000006063311456551414017364 0ustar ingelresingelres# Croatian translation for decibel-audio-player # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-05-13 12:57+0000\n" "Last-Translator: cookie \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Broj trake" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Žanr" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Datum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Trajanje u sekundama" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Broj traka na listi" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Nepoznat žanr" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Nepoznat album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " cookie https://launchpad.net/~ammon117" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Zahvaljujemo:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Potrebna zaporka" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Postavke" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduli" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Opis" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Izaberite radnu mapu" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "pauzirano" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Preskoči traku" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pauziraj trenutnu traku" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Sviraj prvu traku na listi" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Nastavi svirati trenutnu traku" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Dužina" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Ponovi" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "učitavanje..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM uređaj" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Korisničko ime:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "sekunde" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Preimenuj" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Poruka:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Preostalo vrijeme" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Ime:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/da.po0000644000175000017500000006663011456551414017342 0ustar ingelresingelres# Danish translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-09-30 10:41+0000\n" "Last-Translator: Peter Skov \n" "Language-Team: Danish \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Nummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Kunstner" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genre" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Dato" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Disknummer" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Varighed i sekunder (eksempel, 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Varighed som tekststreng (eksempel, 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Nummerets position i playlisten" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Antal numre i playlisten" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Filens komplette sti" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disk %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Ukendt genre" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Ukendt Titel" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Ukendt album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Ukendt kunstner" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Ukendt Album Kunstner" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Asbjørn Clemmensen https://launchpad.net/~func\n" " Peter Skov https://launchpad.net/~a0peter" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Udvikler:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Tak til:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Adgangskode nødvendig" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Om kodeord og lagringssikkerhed" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Hvis du bruger Gnome, er det sikkert at gemme dit kodeord, da Gnome Keyring " "bliver brugt." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Hvis du ikke bruger Gnome, vær da opmærksom på, at selvom kodeordet ikke " "bliver gemt i ren tekst, så kan en uvedkommende få adgang til det." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Indstillinger" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Kunne ikke indlæse dette modul." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduler" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Beskrivelse" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Denne dialogboks viser en liste med de tilgængelige moduler, som er små " "stykker kode som tilføjer funktionalitet til programmet. Du kan slå et modul " "til eller fra ved at bruge checkboksen foran det. Bemærk at nogle moduler " "(for eksempel File Explorer) kan ikke slås fra." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Konfigurerer et modul" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Når et modul kan konfigureres vises et bestemt ikon på højre side af den " "pågældende linje. For at konfigurere et modul skal du markere det og klikke " "på \"Indstillinger\"-knappen nederest i dialogboksen. Bemærk at moduler kun " "kan konfigureres når de er slået til." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Vælg en mappe" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Denne sti eksisterer ikke" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Vælg en eksisterende mappe." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Navnet er forkert" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Dette navn er ikke tilladt.\n" "Vælg venligst et andet." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Tegnet %s er ikke tilladt.\n" "Brug venligst et andet navn." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Opdater statusmeddelelsen i din IM-klient" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel er stoppet" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [pauset]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Dette modul opdaterer din status i et kørende Instant Messenger program med " "data fra det nummer du lytter til. Understøttede IM-programmer er:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Tilpasser Status" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Du kan indstille statusteksten til hvadsomhelst. Før den indstilles " "erstatter modulet alle felter med formen {felt} med dets tilhørende værdi. " "De tilgængelige felter er:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Markup" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Du kan bruge Pango markup sprog til formattering af teksten. Mere " "information om sproget kan findes på følgende website:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Oprydning" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Du kan definere nogle ord som skal opryddes før de indstilles som status. I " "dette tilfælde erstattes de midterste bogstaver i et matchende ord " "automatisk med stjerner (eksempelvis \"Metallica - Live S**t Binge & " "Purge\"). Put ét ord per linie." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Hold din Last.fm-profil opdateret." #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "din Last.fm-konto" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pause]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "De følgende Python-moduler er ikke tilgængelige:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Du skal installere dem hvis du vil bruge dette modul." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Desktop Notification" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Vis en desktop notification når nummeret skifter" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Spring over nummer" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Dette modul viser et småt popup-vindue på dit skrivebord når et nyt nummer " "starter." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Indstiller Notification" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Du kan ændre titlen og teksten i en notification til hvad du vil. Før popup-" "vinduet vises erstattes felter i formen {felt} med deres tilhørende værdi. " "Tilgængelige felter er:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Sæt dette nummer på pause" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Spil det første nummer i playlisten" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Fortsæt det nuværende nummer" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Vælg venligst en explorer\n" "i combo-boxen nedenfor." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Længde" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Gem spilleliste" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Tilskær" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Gentag" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Gem afspilningsliste som..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "File Explorer" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Hjem" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "indlæser..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Vis skjulte filer" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Fjern den markerede ting?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Brug" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliotek" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "spor" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Lyd CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ugyldig sti" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Omslag" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Ryd mellemlager" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Tilføj til spilleliste" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Adgangskode:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Husk denne adgangskode" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Brugernavn:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etiket" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titel" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "sekunder" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Omdøb" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Foretag intet" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Besked:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Sæt status til:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Ryd" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Ryd afspilningslisten" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tid forløbet" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Afslut dette program" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Vælg tilfældigt" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "R_edigér" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fil" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Hjælp" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Navn:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Sti:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/pl.po0000644000175000017500000010301311456551414017354 0ustar ingelresingelres# Polish translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-11-17 15:09+0000\n" "Last-Translator: Jakub 'Livio' Rusinek \n" "Language-Team: Polish \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Numer ścieżki" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Tytuł" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Wykonawca" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Gatunek" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Data" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Numer dysku" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Czas trwania w sekundach (np. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Czas trwania w min:sek (np. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Pozycja utworu na liście odtwarzania" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Ilość utworów na liście odtwarzania" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Pełna ścieżka do pliku" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Nieznany gatunek" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Nieznany Tytuł" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Nieznany Album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Nieznany Wykonawca" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Adam Dziuba https://launchpad.net/~dziobak-adm\n" " Jakub 'Livio' Rusinek https://launchpad.net/~liviopl-pl\n" " Maciej Habant https://launchpad.net/~lays\n" " Tomasz Dominikowski https://launchpad.net/~dominikowski\n" " Wit Wilinski https://launchpad.net/~wit-wilinski\n" " timecage https://launchpad.net/~anantamusic" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Deweloper:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Podziękowania dla:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Podaj nazwę użytkownika i hasło \n" "z %(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Wymagane hasło" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "O bezpieczeństwie przechowywania haseł" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Jeżeli Decibel działa w środowisku GNOME, hasło przechowywane jest w " "bezpieczny sposób dzięki użyciu bazy kluczy GNOME." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Jeżeli Decibel nie działa w środowisku GNOME, hasło przechowywane jest jako " "czysty tekst i istnieje możliwość wykradzenia go." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Ustawienia" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Nie można załadować tego modułu." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduły" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Opis" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "To okno dialogowe pokazuje listę dostępnych modułów - małych fragmentów " "kodu, które służą dodaniu nowych funkcji do aplikacji. Możesz włączyć lub " "wyłączyć moduł przez zaznaczenie/odznaczenie pola przed nazwą modułu. " "Niektóre moduły (np. File Explorer) nie mogą zostać wyłączone." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Konfiguracja modułu" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Jeśli moduł można skonfigurować, po prawej stronie jego nazwy pojawi się " "specjalna ikona. Aby skonfigurować ten moduł zaznacz go, po czym kliknij na " "przycisk \"Ustawienia\" na dole okna dialogowego. Konfiguracja modułu jest " "możliwa tylko, jeśli został on włączony." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Wybierz folder" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Ta ścieżka dostępu nie istnieje" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Wybierz istniejący katalog." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Nazwa jest nieprawidłowa" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Ta nazwa jest niedozwolona.\n" "Proszę użyć innej." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Znak %s jest niedozwolony.\n" "Proszę użyj innej nazwy" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Status komunikatora" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Zmień opis statusu w Twoim komunikatorze" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel jest zatrzymany" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Ten moduł wykrywa każdy uruchomiony komunikator i aktualizuje opis, " "umieszczając w nim dane utworu, który jest odtwarzany. Obsługiwanymi " "komunikatorami są:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Dostosowywanie opisu statusu" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Opis może zawierać dowolny tekst. Moduł automatycznie zastępuje wszystkie " "pola formularza {pole} odnoszącą się do nich wartością.\r\n" "Dostępnymi polami są:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Znacznik" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "W celu sformatowania tekstu możesz użyć języka Pango. Więcej informacji na " "temat tego języka jest dostępnych na następującej stronie:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Sanitaryzacja" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Możesz zdefiniować kilka słów w celu sanitaryzacji, zanim użyjesz ich w " "swoim statusie. W tym przypadku środkowe znaki pasujących słów są " "automatycznie zamieniane na asterysk (np. \"Metallica - Live S**t Binge & " "Purge\"). W jedną linię wstaw jedno słowo." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Aktualizuj profil Last.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Twoje konto Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pauza]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Następujące moduły Pythona nie są dostępne:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Musisz je zainstalować, jeśli chcesz włączyć ten moduł." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Powiadomienia" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Wyświetlaj powiadomienia przy zmianie utworu" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Pomiń utwór" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Ten moduł wyświetla małe okno na Twoim pulpicie, gdy rozpoczyna się " "odtwarzanie kolejnego utworu." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Dostosowywanie powiadomień" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Możesz zmienić tytuł oraz treść powiadomienia na dowolny tekst. Pola " "formularza {pole} zamieniane są na odpowiednie dla nich wartości. Dostępne " "pola to:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Wstrzymaj odtwarzanie" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Odtwórz pierwszy utwór na liście odtwarzania" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Wznów odtwarzanie" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Wybierz przeglądarkę za \n" "pomocą poniższego przycisku kombo." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Długość" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Zapisz listę odtwarzania" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Przytnij" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Powtórz" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Zapisz listę odtwarzania jako..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Przeglądarka plików" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Przeglądaj system plików" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Katalog domowy" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "wczytywanie..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Pokaż ukryte pliki" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Będziesz miał możliwość dodania tego folderu roota później, jeśli chcesz." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Usunąć wybrany wpis?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Będziesz miał możliwość dodania tych folderów roota później, jeśli chcesz." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Usunąć wszystkie wybrane wpisy?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Twoje pliki multimedialne nie zostaną usunięte." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Ten moduł umożliwia przeglądanie plików na twoich dyskach." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Sposób użycia" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Przynajmniej jeden folder roota musi zostać dodany, aby przeglądać twoje " "pliki. Ten folder stanie się rootem w drzewie katalogów przeglądarki, w " "głównym oknie programu." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Biblioteka" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Uporządkuj swoją muzykę według tagów, zamiast według plików." #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Tworzenie biblioteki" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Odświeżanie biblioteki" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Folder jest skanowany w poszukiwaniu plików multimedialnych. Może to potrwać " "dłuższą chwilę.\n" "Proszę czekać." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Tworzenie biblioteki..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Odświeżanie biblioteki..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "utwory" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Będziesz mógł ponownie utworzyć tą bibliotekę później, jeśli chcesz." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Usunąć zaznaczoną bibliotekę?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Będziesz mógł ponownie utworzyć te biblioteki później, jeśli chcesz." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Usunąć wszystkie zaznaczone biblioteki?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Twoje pliki multimedialne nie zostaną usunięte." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Ten moduł porządkuje twoje pliki multimedialne według tagów, zamiast używać " "struktury plików z twojego dysku. Ładowanie utworów jest również szybsze, " "ponieważ ich tagi są już znane i nie trzeba wczytywać ich ponownie." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Gdy dodajesz nową bibliotekę, musisz podać pełną ścieżkę dostępu do folderu " "roota tej biblioteki. Później wsyzstkie katalogi z tej ścieżki są " "wielokrotnie skanowane w poszukiwaniu plików multimedialnych, a tagi tych " "plików wczytywane i zapisywane w bazie danych." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Podczas odświeżania biblioteki, struktura plików w folderze roota oraz " "wsystkie pliki są skanowane w poszukiwaniu zmian, w celu poprawnej " "aktualizacji bazy danych." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Ikona statusu" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Dodaj ikonę do obszaru powiadomień" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Audio CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Odtwarzaj płyty audio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "pobieranie danych..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Nie znaleziono dysku" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "To usunie wszystkie informacje o dysku zapisane na twoim dysku twardym." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Czy wyczyścić cache dla CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Nieprawidłowa ścieżka" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Ścieżka dostępu do urządzenia CD-ROM jest niepoprawna. Wybierz istniejącą " "ścieżkę." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "Ten moduł pozwala odtwarzać dyski audio z twojego urządzenia CD-ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Baza danych dysku kompaktowego (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Informacje o dysku, takie jak wykonawca i tytuł albumu, mogą być " "automatycznie pobierane z internetowej bazy danych, jeśli tego chcesz. " "Informacje te mogą również zostać zapisane na twoim dysku twardym w celu " "uniknięcia ponownego pobierania ich podczas następnego odtwarzania tego " "samego dysku." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Okładki" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Pokaż okładki albumów" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Ten moduł wyświetla okładkę albumu, z którego pochodzi aktualnie odtwarzany " "utwór. Okładki mogą być ładowane z lokalnych plików graficznych, " "znajdujących się w tym samym katalogu, w którym znajduje się odtwarzany " "utwór, lub pobierane z Internetu." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Okładki użytkownika" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Okładka użytkownika to plik graficzny, znajdujący się w tym samym katalogu, " "w którym znajduje się odtwarzany utwór. Przy wprowadzaniu nazw plików nie " "musisz dodawać rozszerzeń - obsługiwane są wszystkie formaty (%s)." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Okładki z internetu" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Okładki mogą być pobierane z Internetu na podstawie znaczników aktualnie " "odtwarzanego utworu. Możesz zmienić ustawienia tak, by zawsze priorytetowymi " "były okładki użytkownika. Wtedy, jeśli istnieje, używany jest plik lokalny, " "w przeciwnym przypadku okładka pobierana jest z Internetu." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Plik statusu" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Wygeneruj tekst z obecnym statusem" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Ścieżka dostępu do wybranego pliku jest niepoprawna. Wybierz istniejącą " "ścieżkę." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Wybierz plik" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "Ten moduł generuje tekst odnośnie do aktualnie odtwarzanego utworu." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Dostosowywanie pliku" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Możesz zmienić zawartość pliku na dowolny tekst. Zanim wygenerujesz plik, " "pola formularza {field} zostaną podmienione odpowiadającą im wartością. " "Dostępnymi polami są:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Różne" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Urządzenie CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Wyczyść cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Pobierz informacje o dysku" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Pobierz informacje o dysku z internetowej bazy danych" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Lokalizacja twojego urządzenia CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Usuń wszystkie informacje o dysku z twojego dysku twardego" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Zapisz informacje o dysku na twoim dysku twardym" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Zapisz informacje w lokalnej pamięci cache" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Dodaj do listy odtwarzania" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Dodaj zaznaczenie do listy odtwarzania" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Podmień listę odtwarzania zaznaczeniem i rozpocznij odtwarzanie" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Przeskanuj ponownie dysk audio" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Hasło:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Zapamiętaj to hasło:" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Nazwa użytkownika:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etykieta" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Okładki z Internetu" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Okładki użytkownika" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Preferuj okładki użytkownika" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Nie pobieraj z Internetu, jeśli istnieje okładka użytkownika" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Pobierz okładki" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Nazwy plików do wyszukiwania (np. folder, cover)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Nazwy plików:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Próbuj pobierać okładki z Internetu" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Body" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Tytuł" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Limit czasu powiadomienia:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Pokaż przycisk \"przeskocz utwór\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Czas wyświetlania powiadomienia" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "sekundy" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Foldery Root" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Dodaj nowy folder roota do przeglądarki plików" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Usuń zaznaczone foldery roota" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Zmień nazwe" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Zmień nazwę wybranego folderu roota" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Czy ukryte pliki mają być wyświetlane w przeglądarce plików" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Sanitaryzowane słowa" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Przy Zatrzymaniu lub Wyjściu" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Nic nie rób" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Wiadomość:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Ustaw status na:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Zaktualizuj nawet, gdy nie jest to dostępne" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Zaktualizuj podczas pauzy" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" "Zaktualizuj twój status nawet, gdy jesteś zaznaczony jako niedostępny" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Zaktualizuj twój status podczas zdarzenia pauzy/kontynuacji" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Biblioteki" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Dodaj nową bibliotekę" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Usuń zaznaczone biblioteki" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Zmień nazwę zaznaczonej biblioteki" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Zaktualizuj zaznaczoną bibliotekę poprzez ponowne skanowanie dysku" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Wyczyść" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Wyczyść listę odtwarzania" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Wyświetl okno dialogowe \"O\"" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Wyświetl preferencje" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Czas odtwarzania" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Pomoc online" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Otwórz stronę pomocy online" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Odtwarzaj wszystkie utwory bez końca" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Odtwórz następny utwór" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Odtwórz poprzedni utwór" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Zakończ program" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Czas pozostały" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Znajdź pozycję w odtwarzanym utworze" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Wybierz przeglądarkę" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Odtwarzanie losowe" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Odtwarzaj losowo listę" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Zatrzymaj utwór" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Edycja" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Plik" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Pomoc" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nazwa:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Ścieżka:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Plik" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Status Odtwarzania" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Odtwarzaj/Kontynuuj" ./decibel-audio-player-1.06/po/en_GB.po0000644000175000017500000005770711456551414017735 0ustar ingelresingelres# English (United Kingdom) translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-04-02 18:55+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: English (United Kingdom) \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/kk.po0000644000175000017500000006066011456551414017360 0ustar ingelresingelres# Kazakh translation for decibel-audio-player # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-06-09 06:07+0000\n" "Last-Translator: baurzhan.m \n" "Language-Team: Kazakh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Трек нөмірі" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Трек аты" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Орындайтын" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Альбом" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Жанры" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Күні" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Диск нөмірі" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " baurzhan.m https://launchpad.net/~baurthefirst" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Пароль керек" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Баптаулар" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Бұл модульді жүктеу мүмкін емес." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Модульдер" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Анықтамасы" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Буманы таңдаңыз" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Жол қате" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Бар болып тұрған буманы таңдаңыз." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Аты дұрыс емес" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Бұл атауға рұқсат жоқ.\n" "Басқасын таңдаңыз." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/bs.po0000644000175000017500000006005511456551414017355 0ustar ingelresingelres# Bosnian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-04-12 10:56+0000\n" "Last-Translator: Sanel \n" "Language-Team: Bosnian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Sanel https://launchpad.net/~sanel-bih" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/el.po0000644000175000017500000012504611456551414017353 0ustar ingelresingelres# Greek translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-12-22 20:21+0000\n" "Last-Translator: koleoptero \n" "Language-Team: Greek \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Αριθμός κομματιού" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Τίτλος" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Καλλιτέχνης" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Άλμπουμ" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Είδος" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Ημερομηνία" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Αριθμος Δίσκου" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Διάρκεια σε δευτερόλεπτα (π.χ. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Διάρκεια" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Θέση κομματιού στην λίστα" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Αριθμός κομματιών στη λίστα" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Πλήρης διαδρομή προς το αρχείο" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Δίσκος %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Άγνωστο είδος" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Άγνωστος Τίτλος" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Άγνωστο άλμπουμ" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Άγνωστος καλλιτέχνης" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Άγνωστος Καλλιτέχνης Δίσκου" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " koleoptero https://launchpad.net/~vaggus" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Δημιουργός:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Ευχαριστίες σε:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Εισάγετε το όνομα χρήστη και κωδικό για το\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Απαιτείται κωδικός" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Σχετικά με την ασφάλεια αποθήκευσης κωδικών" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Αν χρησιμοποιείτε το Gnome, είναι ασφαλές να αποθηκεύσετε τον κωδικό σας " "εφόσον χρησιμοποιείται το σύστημα διαχείρισης κωδικών του Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Αν δεν χρησιμοποιείτε το Gnome, έχετε υπ' όψιν σας ότι παρόλο που δεν " "αποθηκεύεται σαν απλό κείμενο, κάποιος μπορεί να τον ανακτήσει." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Προτιμήσεις" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Το πρόσθετο δεν μπόρεσε να φορτωθεί." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Πρόσθετα" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Περιγραφή" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Αυτό το παράθυρο διαλόγου δείχνει τη λίστα με τα διαθέσιμα πρόσθετα, τα " "οποία είναι μικρά κομμάτια κώδικα που προσφέρουν κάποιες πρόσθετες " "λειτουργίες στην εφαρμογή. Μπορείτε να ενεργοποιήσετε/απενεργοποιήσετε ένα " "πρόσθετο, χρησιμοποιώντας το κουτάκι που βρίσκεται μπροστά του. Έχετε υπόψιν " "σας ότι μερικά πρόσθετα (π.χ. το Εξερευνητής Αρχείων) δεν μπορούν να " "απενεργοποιηθούν." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Ρυθμίζοντας ένα πρόσθετο" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Όταν ένα πρόσθετο μπορεί να ρυθμιστεί, υπάρχει ένα είκονίδιο στα δεξιά της " "αντίστοιχης γραμμής. Για να ρυθμίσετε το πρόσθετο, απλά επιλέξτε το και μετά " "κάντε κλικ στο κουμπί \"Προτιμήσεις\" που βρίσκεται στο κάτω μέρος του " "παραθύρου. Έχετε υπ' όψιν σας ότι ένα πρόσθετο μπορεί να ρυθμιστεί μόνο όταν " "είναι ενεργοποιημένο." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Επιλογή φακέλου" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Η διαδρομή αυτή δεν υπάρχει" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Παρακαλώ επιλέξτε ένα ήδη υπάρχον φάκελο" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Το όνομα είναι λάθος" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Το όνομα αυτό δεν επιτρέπεται.\n" "Παρακαλώ επιλέξτε κάποιο άλλο." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Ο χαρακτήρας %s δεν επιτρέπεται.\n" "Παρακαλώ χρησιμοποιήστε ένα άλλο όνομα." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Προσωπικό μήνυμα προγράμματος άμεσων μηνυμάτων." #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" "Ενημερώστε το προσωπικό μήνυμα του προγράμματος άμεσων μηνυμάτων σας." #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Το Decibel είναι σταματημένο" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [παύση]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Το πρόσθετο αυτό εντοπίζει αν χρησιμοποιείτε κάποιο πρόγραμμα άμεσων " "μηνυμάτων και ενημερώνει το προσωπικό σας μήνυμα με βάση τα στοιχεία του " "κομματιού που ακούτε. Υποστηριζόμενα προγράμματα είναι τα:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Προσαρμόζοντας την κατάσταση λειτουργίας" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Μπορείτε να ορίσετε την κατάσταση λειτουργίας με ότι κείμενο θέλετε. Πριν " "την καθορίσει, το πρόσθετο αντικαθιστά όλα τα πεδία της φόρμας {πεδίο} με " "την αντίστοιχη τιμή. Διαθέσιμα πεδία είναι τα:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Προσημείωση" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Μπορείτε να χρησιμοποιήσετε την γλώσσα προσημειώσεων Pango για να " "διαμορφώσετε το κείμενο. Περισσότερες πληροφορίες για την γλώσσα αυτή " "μπορείτε να βρείτε στην ιστοσελίδα:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Λογοκρισία" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Μπορείτε να καθορίσετε κάποιοες λέξεις που θέλετε να μην εμφανίζονται στο " "προσωπικό μήνυμα όπως είναι. Σε αυτή την περίπτωση, οι ενδιάμεσοι χαρακτήρες " "των λέξεων αυτών θα αντικαθιστούνται με αστεράκια (π.χ. \"Metallica - Live " "S**t Binge & Purge\"). Τοποθετήστε μόνο μία λέξη ανά γραμμή." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Κρατήστε το προφίλ σας στο Last.fm ενημερωμένο" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Ο λογαριασμός σας στο Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Ένα κομμάτι στην λίστα [%(length)s]" msgstr[1] "%(count)u κομμάτια στην λίστα [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[παύση]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Τα παρακάτω πρόσθετα της Python δεν είναι διαθέσιμα:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" "Πρέπει να τα εγκαταστήσετε αν θέλετε να ενεργοποιήσετε αυτό το πρόσθετο." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Ειδοποίηση επιφάνειας εργασίας" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" "Εμφανίζει μια είδοποίηση στην επιφάνεια εργασίας όταν αλλάζει το κομμάτι." #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Επόμενο κομμάτι" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Αυτό το πρόσθετο εμφανίζει ένα μικρό αναδυόμενο παράθυρο στην επιφάνεια " "εργασίας όταν ξεκινάει ένα νέο κομμάτι." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Προσαρμόζοντας τις ειδοποιήσεις" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Μπορείτε να αλλάξετε τον τίτλο και το περιεχόμενο της είδοποίησης όπως σας " "βολεύει. Πρίν εμφανιστεί το αναδυόμενο παράθυρο πεδία της μορφής {πεδίο} " "αντικαθίστανται με την αντίστοιχη τιμή. Διαθέσιμα πεδία είναι τα:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Παύση" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Παίξε το πρώτο αρχείο στη λίστα" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Συνέχεια" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Παρακαλώ επιλέξτε έναν εξερευνητή\n" "στο κουτάκι από κάτω." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Διάρκεια" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Αποθήκευση λίστας αναπαραγωγής" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Αποκοπή μή επιλεγμένων" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Επανάληψη" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Αποθήκευση Λίστας Αναπαραγωγής Ώς..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Εξερευνητής αρχείων" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Πλοηγηθείτε στο σύστημα αρχείων σας" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Αρχικός κατάλογος" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "φόρτωση..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Εμφάνιση κρυφών αρχείων" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Θα έχετε τη δυνατότητα να προσθέσετε αυτόν τον αρχικό κατάλογο αργότερα αν " "επιθυμείτε." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Να αφαιρεθεί το επιλεγμένο στοιχείο;" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Θα μπορέσετε να προσθεσετε αυτούς τους αρχικούς φακέλους ξανά αργότερα αν " "θελήσετε." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Να αφαιρεθούν όλα τα επιλεγμένα στοιχεία;" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Τα μουσικά αρχεία σας δεν θα σβηστούν." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Αυτό το πρόσθετο σας επιτρέπει να πλοηγείστε στα αρχεία τών δίσκων σας." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Χρήση" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Τουλάχιστον ένας αρχικός φάκελος πρέπει να καθοριστεί ώστε να πλοηγηθείτε " "στα αρχεία σας. Αυτός ο φάκελος τότε γίνεται ο αρχικός του δέντρου πλοήγησης " "φακέλων στο κυρίως παράθυρο." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Βιβλιοθήκη" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" "Οργανώστε τη μουσική σας με βάση τα στοιχεία των κομματιών αντί για τα αρχεία" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Δημιουργία βιβλιοθήκης" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Ανανέωση βιβλιοθήκης" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Ανίχνευση καταλόγου για μουσικά αρχεία. Αυτό μπορεί να πάρει λίγη ώρα.\n" "Παρακαλώ περιμένετε." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Σάρωση φακέλων (βρέθηκε ένα κομμάτι)" msgstr[1] "Σάρωση φακέλων (βρέθηκαν %(nbtracks)u κομμάτια)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Δημιουργία βιβλιοθήκης..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Ανανέωση βιβλιοθήκης..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Η βιβλιοθήκη είναι" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "κομμάτια" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" "Θα μπορέσετε να επαναδημιουργήσετε την βιβλιοθήκη αυτή αργότερα αν το " "επιθυμήσετε." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Να αφαιρεθεί η επιλεγμένη βιβλιοθήκη;" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" "θα μπορέσετε να επαναδημιουργήσετε τις βιβλιοθήκες αυτές αργότερα αν το " "επιθυμήσετε." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Να αφαιρεθούν όλες οι επιλεγμένες βιβλιοθήκες;" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Τα μουσικά σας αρχεία δεν θα σβηστούν." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Το πρόσθετο αυτό οργανώνει τα μουσικά αρχεία σας με βάση τα στοιχεία τους " "αντί για τη δομή των αρχείων στον δίσκο σας. Η φόρτωση των αρχείων είναι " "επίσης γρηγορότερη γιατι τα στοιχεία τους είναι ήδη γνωστά και δεν " "χρειάζεται να ανιχνευτούν ξανά." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Όταν προσθέτετε μια νέα βιβλιοθήκη, πρέπει να δώσετε την πλήρη διαδρομή προς " "τον κεντρικό φάκελο αυτής της βιβλιοθήκης. Τότε, όλοι οι φάκελοι που " "βρίσκονται μέσα σε αυτόν ανιχνεύονται για μουσικά αρχεία των οποίων τα " "στοιχεία διαβάζονται και αποθηκεύονται σε μια βάση δεδομένων." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Όταν ανανεώνετε μια βιβλιοθήκη, οι υποφάκελοι και τα αρχεία που βρίσκονται " "μέσα στον κεντρικό φάκελο της βιβλιοθήκης ανιχνεύονται για αλλαγές, και η " "βάση δεδομένων ενημερώνεται ανάλογα." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Εικονίδιο κατάστασης" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Προσθέστε ένα εικονίδιο στην περιοχή ειδοποιήσεων" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [Παύση]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD Ήχου" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Αναπαραγωγή δίσκων ήχου" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "κατέβασμα δεδομένων..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Κομμάτι %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Δεν βρέθηκε δίσκος" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Αυτό θα σβήσει όλες τις πληροφορίες για δίσκους που είναι αποθηκευμένες στον " "σκληρό δίσκο." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Καθαρισμός βάσης CDDB;" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Μη έγκυρη διαδρομή" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Η διαδρομή προς τη συσκευή CD-ROM δεν έιναι έγκυρη. Παρακαλώ επιλέξτε μια " "ήδη υπάρχουσα." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Αυτό το πρόσθετο σας επιτρέπει να αναπαράγετε δίσκους ήχου από τον οδηγό CD." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Βάση δεδομένων στοιχείων δίσκων (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Πληροφορίες για τους δίσκους, όπως καλλιτέχνης και τίτλος δίσκου, μπορούν να " "κατεβαίνουν αυτόματα απο μία βάση δεδομένων στο διαδίκτυο αν θέλετε. Οι " "πληροφορίες αυτές μπορούν επίσης να αποθηκεύονται στον σκληρό δίσκο για να " "αποφευχθεί η ανάγκη να κατέβουν ξανά την επόμενη φορά που θα παίξετε τον " "ίδιο δίσκο." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "των/του/της %(artist)s\n" "από το %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Εξώφυλλα" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Εμφάνιση Εξώφυλλων Δίσκων" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Αυτό το πρόσθετο εμφανίζει το εξώφυλλο του άλμπουμ στο οποίο περιέχετε το " "τρέχον κομμάτι. Τα εξώφυλλα μπορούν να εμφανίζονται από τοπικά αρχεία που " "βρίσκονται στον ίδιο φάκελο με το τρέχον κομμάτι, ή να φορτώνονται από το " "διαδίκτυο." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Εξώφυλλα χρηστών" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Ένα εξώφυλλο χρήστη είναι μιά εικόνα που περιέχεται στον ίδιο φάκελο με το " "τρέχον κομμάτι. Όταν καθορίζετε τα ονόματα τών αρχείων δεν χρειάζετε να " "παρέχετε και τις επεκτάσεις τους. Οι τύποι αρχείων που υποστηρίζονται (%s) " "θα χρησιμοποιούνται αυτόματα." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Εξώφυλλα από το διαδίκτυο" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Τα εξώφυλλα μπορούν να κατέβουν από το διαδίκτυο, με βάση τα στοιχέια του " "τρέχοντος κομματιού. Μπορείτε να δηλώσετε προτίμηση για εξώφυλλα χρήση " "έναντι εξώφυλλων διαδικτύου. Σε αυτή την περίπτωση, αν υπάρχει εξώφυλλο " "χρήστη για το τρέχον κομμάτι, θα χρησιμοποιηθεί. Άν όχι, θα χρησιμοποιηθεί " "εξώφυλλο από το διαδίκτυο." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Αρχείο κατάστασης" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Δημιουργεί ένα αρχείο με την τρέχουσα κατάσταση" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Η διαδρομή προς το συγκεκριμένο αρχείο δεν είναι έγκυρη. Παρακαλώ επιλέξτε " "μία υπάρχουσα διαδρομη." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Επιλέξτε ένα αρχείο" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Αυτό το πρόσθετο δημιουργεί ένα αρχείο με βάση το αρχείο που αναπαράγεται " "αυτή τη στιγμή." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Προσαρμόζοντας το Αρχείο" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Μπορείτε να αλλάξετε το περιεχόμενο του αρχείου όπως θέλετε. Πρίν " "δημιουργηθέι το αρχείο, πεδία της μορφής {πεδίο} αντικαθίστανται με την " "αντίστοιχη τιμή. Διαθέσιμα πεδία είναι τα:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Διάφορα" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Συσκευή CD-ROM" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Καθαρισμός προσωρινής μνήμης" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Κατέβασμα πληροφοριών δίσκου" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" "Κατεβάστε τα στοιχεία του δίσκου από μιά βάση δεδομένων στο διαδίκτυο" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Θέση της συσκευής ανάγνωσης CD" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Διαγράψτε όλες τα στοιχεία δίσκων από τον σκληρό σας δίσκο" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Αποθηκεύστε τα στοιχεία του δίσκου στον σκληρό σας δίσκο" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Αποθηκεύστε τις πληροφορίες σε μια τοπική προσωρινή μνήμη" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Προσθήκη στη λίστα" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Προσθήκη στο τέλος της λίστας" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Αντικατάσταση της λίστας με την επιλογή και εκκίνηση αναπαραγωγής" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Επανεξέταση του δίσκου" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Κωδικός:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Απομνημόνευση κωδικού" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Όνομα χρήστη:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "ετικέτα" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Εξώφυλλα διαδικτύου" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Εξώφυλλα Χρήστη" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Πάντα προτίμηση εξώφυλλων χρήστη" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Μην κατεβάζεις εξώφυλλα αν υπάρχει εξώφυλλο χρήστη." #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Κατέβασμα εξωφυλλων" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Ονόματα αρχείων για εξώφυλλα (π.χ., folder, cover, κλπ)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Ονόματα αρχείων:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Προσπάθησε να κατεβάσεις εξώφυλλα από το διαδίκτυο" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Κορμός" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Τίτλος" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Χρόνος εμφάνισης ειδοποίησης" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Έμφάνισε ένα κουμπί \"Επόμενου\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Χρόνος κατά τον οποίο η ειδοποίηση εμφανίζεται" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "δευτερόλεπτα" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Αρχικοί φάκελοι" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Πρόσθήκη νέου αρχικού φακέλου στον εξερευνητή αρχείων" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Αφαίρεση επιλεγμένων φακέλων" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Μετονομασία" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Μετονομασία του επιλεγμένου αρχικού φακέλου" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Αν τα κρυμμένα αρχεία θα εμφανίζονται στον εξερευνητή αρχείων" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Απαγορευμένες λέξεις" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Κατάσταση" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Κατά το σταμάτημα ή την έξοδο" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Καμία ενέργεια" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Μήνυμα:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Αλλαγή προσωπικού μηνύματος σε:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Ανανέωση ακόμα και όταν είσαι μή διαθέσιμος" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Ανανέωση όταν γίνεται παύση" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Ανανέωση ακόμα και όταν η κατάστασή σας είναι μή διαθέσιμος" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Ανανέωση του προσωπικού μηνύματος κατά την παύση της αναπαραγωγής" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Βιβλιοθήκες" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Προσθήκη νέας βιβλιοθήκης" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Αφαίρεση επιλεγμένων βιβλιοθηκών" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Μετονομασία επιλεγμένης βιβλιοθήκης" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Ανανέωση της επιλεγμένης βιβλιοθήκης με επανανίχνευση του δίσκου" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Καθαρισμός" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Καθαρισμός λίστας αναπαραγωγής" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Εμφάνιση διαλόγου πληροφοριών προγράμματος" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Εμφάνιση επιλογών" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Χρόνος που πέρασε" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Βοήθεια στο διαδίκτυο" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Άνοιγμα της ιστοσελίδας περιεχομένων βοήθειας" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Αναπαραγωγή όλων των κομματιών χωρίς τέλος" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Αναπαραγωγή επόμενου κομματιού" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Αναπαραγωγή προηγούμενου κομματιού" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Έξοδος από την εφαρμογή" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Υπόλοιπος χρόνος" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Αναζήτηση θέσης στο τρέχον κομμάτι" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Επιλογή εξερευνητή" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Ανακάτεμα" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Ανακάτεμα της λίστας αναπαραγωγής" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Διακοπή αναπαραγωγής" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Επεξεργασία" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Αρχείο" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Βοήθεια" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Όνομα:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Διαδρομή:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Αρχείο" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Κατάσταση Αναπαραγωγής" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Έναρξη/Συνέχεια" ./decibel-audio-player-1.06/po/ar.po0000644000175000017500000006471711456551414017364 0ustar ingelresingelres# Arabic translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-11-24 18:43+0000\n" "Last-Translator: MaXeR \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= " "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "رقم المسار" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "العنوان" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "الفنّان" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "الألبوم" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "النوع" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "التاريخ" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "رقم القرص" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "المدة بالثواني (مثال 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "المدة بالمتغيّر (مثل 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "رقم المسار في قائمة التشغيل" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "عدد المسارات في قائمة التشغيل" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "المسار الكامل للملفّ" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [قرص %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "نوع غير معروف" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "عنوان مجهول" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "ألبوم مجهول" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "فنّان مجهول" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "فنان الألبوم مجهول" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " MaXeR https://launchpad.net/~themaxer\n" " صقر بن عبدالله https://launchpad.net/~agari" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "مطوِّر:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "أدخل إسم المستخدم و كلمة المرور لـ:\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "التفضيلات" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "الوحدات" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "الوصف" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "جارِ ضبط الوحدة" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "اختيار المجلّد" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "الاسم خطأ" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "حالة المراسل الفوريّ" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "تم إيقاف Decibel" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "جارِ تخصيص الحالة" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "حسابك لدى Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[موقّف مؤقّتاً]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "إشعار على سطح المكتب" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "تخصيص الإشعار" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "مدّة" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "حفظ قائمة التشغيل" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "إعادة" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "حفظ قائمة التشغيل باسم..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "منزل" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "الاستعمال" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "مكتبة" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "جارِ إنشاء المكتبة" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "جارِ إعادة تحميل المكتبة" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "جارِ إنشاء المكتبة..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "جارِ إعادة تحميل المكتبة..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "مقاطع" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "حذف المكتبة المنقية؟" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "أيقونة الحالة" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "قرص مدمج صوتيّ" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "عزف الأقراص الصوتيّة" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "جارٍ تنزيل البيانات..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "لم يتم العثور على قرص" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "ملفّ الحالة" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "اختيار الملفّ" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "تخصيص الملفّ" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "متنوّعات" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "جهاز CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "محو الذاكرة المخبئة" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "تنزيل معلومات القرص" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "إضافة لقائمة التشغيل" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "كلمة السرّ:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "تذكّر كلمة السرّ" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "اسم المستخدم:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "عنوان" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "ثانية" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "إعادة تسمية" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "الحالة" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "لا تفعل شيءً" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "الرسالة:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "تعيين الحالة:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "مكتبات" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "إضافة مكتبة جديدة" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "حذف المكتبات المنقية" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "إعادة تسمية المكتبة المنقية" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "محو" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "محو قائمة التشغيل" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "تفضيلات العرض" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "الزمن المنقضي" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_مساعدة على الشبكة" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "عزف المقطع التاليّ" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "عزف المقطع السابق" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "مغادرة التطبيق" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "الزمن الباقي:" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "إيقاف المقطع الحاليّ" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "ت_حرير" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_ملفّ" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_مساعدة" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "الاسم:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "المسار:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "ملفّ" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "حالة العزف" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "عزف/إيقاف مؤقّتاً" ./decibel-audio-player-1.06/po/ga.po0000644000175000017500000006074411456551414017345 0ustar ingelresingelres# Irish translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-05-09 16:14+0000\n" "Last-Translator: Seanan \n" "Language-Team: Irish \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 ? 1 : 2;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Uimhir an rrian" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Teideal" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Ealaíontóir" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Albam" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Fad i soicind (m.sh., 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Fad mar teaghrán (m.sh., 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Líon na rianta sa seinmréim" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Albam Anaithnid" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Ealaíontóir Anaithnid" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Seanan https://launchpad.net/~seananoc-gmail" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Forbóir" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Buíochas le:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Focal faire de dhíth" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Sainroghanna" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Cur síos" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Roghnaigh fillteán" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Níl an chonair seo ann" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Roghnaigh comhadlann atá ann cheana." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Tá an t-ainm mícheart" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Coinnigh do bheathaisnéisín Last.fm cothrom le dáta" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "do chuntas Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[ar sos]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Fad" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Baile" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Úsáid" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "Leabharlann" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "rianta" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD Fuaime" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Roghnaigh comhad" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Éagsúil" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Glan an taisce" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/ca.po0000644000175000017500000006133711456551414017340 0ustar ingelresingelres# Catalan translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-08-22 10:20+0000\n" "Last-Translator: toni \n" "Language-Team: Catalan \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Número de pista" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Títol" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artista" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Àlbum" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Gènere" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Data" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Número de disc" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Duració en segons" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Duració en cadena de text" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Posició de la pista dins la llista de reproducció" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Número de pistes a la llista de reproducció" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Ruta sencera fins a l'arxiu" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Gènere desconegut" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Títol desconegut" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Àlbum desconegut" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artista desconegut" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Àlbum de l'Artista desconegut" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " toni https://launchpad.net/~unmail-toni" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Desenvolupador" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Gràcies a:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Es necessita el mot de pas" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Sobre la seguretat per a desar el mot de pas" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Si empres Gnome, pots desar el teu mot de pas de manera segura ja que s'està " "fent servir l'anell de claus de Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "SI no fas servir Gnome, tingues en compte que encara que no es desi com a " "una cadena de text, un attacant podria aconseguir-lo." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferències" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "No s'ha pogut carregar aquest mòdul." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Mòduls" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descripció" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/tr.po0000644000175000017500000006311111456551414017372 0ustar ingelresingelres# Turkish translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-02-05 02:20+0000\n" "Last-Translator: DenizCakir \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Parça numarası" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Saniye bazında süre" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "İz'in çalma listesindeki sırası" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Çalma listesindeki iz sayısı" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Dosyanın tam yolu" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Bilinmeyen Albüm" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Bilinmeyen Sanatçı" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Atbeyi https://launchpad.net/~atbeyi\n" " DenizCakir https://launchpad.net/~dezincakir\n" " denz https://launchpad.net/~psycho2dct" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Üretici" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Teşekkürler:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Parola gerekli" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Parola saklama güvenliği ile ilgili" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Eğer Gnome kullanıyorsanız, parolalarınızı güvenle saklayabilirsiniz çünkü " "Gnome Keyring aracını kullanılmaktadır." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Eğer Gnome kullanmıyorsanız, bilmelisiniz ki , her ne kadar basit metin " "dosyası olarak saklanmasa da bir saldırgan ele geçirebilir" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Yeğlenenler" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Bu modül yüklenemedi" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Modüller" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Tanım" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Bu iletişim kutusu olanaklı modüllerin listesini gösterir. Modüller " "uygulamaya kimi beceriler ekleyen küçük kod parçalarıdır. Herhangi bir " "modülü önündeki kutucuğu işaretleyerek/işaretlemeyerek geçerli/geçersiz " "kılabilirsiniz. Unutmayın ki bazı modüller (örneğin : Dosya Gezgini) " "geçersiz kılınamaz." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Modül Ayarlama" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Bir klasör seçin" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Bu yol yok" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Lütfen var olan bir dizin seçin" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "%s karakteri kullanılamaz.\n" "Lütfen başka bir isim girin." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel durduruldu" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Metni biçimlendirmek için Pango dilini kullanabilirsiniz. Bu dille ilgili " "daha fazla bilgiyi verilen bu adreste bulabilirsiniz:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Last.fm profilinizi güncel tutun" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Last.fm hesabınız" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[Beklemede]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Bu Python modülleri kullanılmıyor" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Şarkı değiştiğinde masaüstünde hatırlatma göster" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Şarkıyı atla" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Bu modül yeni bir şarkı başladığında masaüstünüzde küçük pencere gösterir" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Hatırlatmayı kişiselleştir" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Çalan şarkıyı beklet" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Playlistteki ilk şarkıyı çal" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/it.po0000644000175000017500000007713011456551414017367 0ustar ingelresingelres# Italian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-01-04 17:45+0000\n" "Last-Translator: AlckO \n" "Language-Team: Italian \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Numero traccia" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titolo" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artista" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genere" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Data" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Numero disco" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Durata in secondi (e.g., 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Durata (es. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Posizione della traccia nella playlist" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Numero di tracce nella playlist" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Percorso completo del file" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Genere sconosciuto" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Titolo sconosciuto" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Album sconosciuto" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artista sconosciuto" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Artista Sconosciuto" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " AlckO https://launchpad.net/~alckox\n" " Kurama https://launchpad.net/~luca.perri\n" " Luca Livraghi https://launchpad.net/~luca91\n" " Nicolò Ricco https://launchpad.net/~hapellone\n" " Riccardo Magliocchetti https://launchpad.net/~riccardo\n" " calabrozzo https://launchpad.net/~calabrozzo\n" " texxxxxx https://launchpad.net/~asdfghjkl01" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Sviluppatore:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Si ringrazia:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Inserisci la tua username e password per\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Password richiesta" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Informazioni sul salvataggio sicuro della password" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Se stai usando Gnome,è sicuro memorizzare la tua password da quando Gnome " "keyring è usato." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferenze" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Impossibile caricare il modulo." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduli" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descrizione" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Questa finestra di dialogo mostra la lista dei moduli disponibili, che sono " "dei piccoli pezzi di codice che aggiungono alcune funzioni all'applicazione. " "Puoi abilitare/disabilitare un modulo aggiungendo/togliendo il simbolo di " "spunta dalla casella vicina. Nota che alcuni moduli (per es. il File " "Explorer) non possono essere disabilitati." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configura un modulo" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Quando un modulo viene configurato, è presente un'icona specifica sulla " "destra della riga corrispondente. Per configurare un modulo, selezionalo e " "premi sul pulsante \"Preferenze\" della finestra di dialogo. Nota che è " "possibile configurare un modulo solo quando questo è abilitato." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Scegli una cartella" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Questo percorso non esiste" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Per favore seleziona una cartella esistente" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Il nome non è corretto" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Questo nome non è ammesso.\n" "Prova a sceglierne un altro." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Il carattere %s non è ammesso.\n" "Prova a sceglierne un altro." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Stato messaggistica istantanea" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Aggiorna lo stato del tuo client di messaggistica istantanea" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel è fermo" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [paused]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Questo modulo rileva i programmi di messaggistica istantanea e ne aggiorna " "lo stato con la traccia che stai ascoltando. I programmi supportati sono:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Personalizza lo stato" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Markup" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Puoi usare il linguaggio di markup Pango per formattare il testo. Maggiori " "informazioni sul linguaggio sono disponibili sulla seguente pagina web:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Mantieni il tuo profilo Last.fm aggiornato" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "il tuo account Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Una traccia nella playlist [%(length)s]" msgstr[1] "%(count)u tracce nella playlist [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausa]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "I seguenti moduli Python non sono disponibili:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Devi installarli se vuoi abilitare questo modulo." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notifica desktop" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Visualizza una notifica sul desktop al cambio della traccia" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Salta traccia" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Questo modulo visualizza una piccola finestra pop-up sul desktop quando " "inizia una nuova traccia" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Personalizza la notifica" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "È possibile personalizzare il titolo e il corpo della notifica in qualsiasi " "modo. Prima della visualizzazione della finestra pop-up, i campi {field} " "saranno rimpiazzati con i corrispondenti valori. I campi disponibili sono:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Metti in pausa la traccia corrente" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Ascolta la prima traccia della playlist" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continua l'ascolto della traccia corrente" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Seleziona una risorsa da esplorare\n" "nella combo box sottostante." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Durata" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Salva playlist" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Taglia" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Ripeti" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Salva playlist come..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "File Explorer" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Sfoglia il tuo file system" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Home" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "Caricamento in corso..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Mostra i file nascosti" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Potrai aggiungere questa cartella radice anche in seguito." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Rimuovere la voce selezionata?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Potrai aggiungere queste cartelle radice anche in seguito." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Rimuovere tutte le voci selezionate?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "I tuoi media file non saranno cancellati." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Questo modulo ti permette di sfogliare i file presenti nei tuoi dischi." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Utilizzo" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Devi aggiungere almeno una cartella radice per poter navigare tra i tuoi " "files. Questa cartella sarà la radice del file explorer nella finestra " "principale." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Libreria" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organizza la tua musica per tag anzichè per file" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Creazione libreria" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Aggiornamento libreria" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Scansione cartella per file multimediali. Potrebbe durare alcuni minuti.\n" "Attendere." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Scansione cartelle (una traccia trovata)" msgstr[1] "Scansione cartelle (%(nbtracks)u tracce trovata)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Creazione libreria..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Aggiornamento libreria..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Il catalogo è vetusto, per favore aggiornalo." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "tracce" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Potrai ricreare questa libreria anche in seguito, se lo desideri." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Rimuovere la libreria selezionata?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Potrai ricreare questa librerie anche in seguito, se lo desideri." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Rimuovere le librerie selezionate?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "I tuoi file multimediali non saranno rimossi." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Questo modulo organizza la libreria musicale in base ai tags, invece della " "struttura dei file sul disco. Il caricamento delle tracce è anche più veloce " "perchè i tags sono già noti e non devono essere acquisiti di nuovo." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Quando aggiungi una libreria musicale, bisogna inserire il path completo " "della directory di root della stessa libreria.Quindi tutte le cartelle del " "path fornito vengono scansite, incluse sottocartelle,leggendo tutti i tags " "dei file musicali che verrano memorizzati in un database." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Icona di stato" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Aggiungi una icona all'area di notifica" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [in pausa]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD Audio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Riproduci dischi audio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "Scaricamento dati..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Traccia %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Nessun disco trovato" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Questo rimuoverà ogni informazione del disco memorizzata sull'hard-disk" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Pulire la cache CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Percorso non valido" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Il percorso dell'unità CD-ROM non è valido. Scegliere un percorso esistente." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Questo modulo permette l'esecuzione di dischi audio attraverso l'unità CD-" "ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc Data Base (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Se si desidera, le informazioni sul disco come: artista e titolo album, " "posso essere scaricate automaticamente dal database remoto. Queste " "informazioni possono essere salvate sul tuo hard disk per evitare di essere " "scaricate nuovamente nel momento in cui viene ascoltato lo stesso disco." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Copertine" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Mostra copertine album" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Questo modulo visualizza la cover dell'album della traccia che stai " "ascoltando. Le covers posso essere caricate da immagini locali, presenti " "nella stessa cartella della traccia, o essere scaricate da Internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Covers utente" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Le Covers utente sono immagini che si trovano nella stessa directory della " "traccia corrente. Quando specifichi un nome del file, non è neccessario " "indicare l'estensione poichè verrano caricati automaticamente i file " "supportati (%s)." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Covers Scaricate" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "File di stato" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Genera un file di testo con lo stato corrente" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Il percorso per il file selezionato non è valido. Per favore scegli un " "percorso valido." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Scegli un file" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Questo modulo genera un file di testo riguardo alla traccia che si sta " "ascoltando." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Personalizza il file" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Varie" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Unità CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Svuota la cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Scarica informazioni del disco" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Scarica informazioni del disco da un database online" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Percorso dell'unità CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Rimuovi tutte le informazioni del disco dall'hard disk" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Salva le informazioni del disco sull'hard disk" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Salva informazioni nella cache locale" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Aggiungi alla playlist" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Aggiungi la selezione alla playlist" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Sostituisci la playlist con la selezione e inizia la riproduzione" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Rileggi il CD audio" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Password:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Ricorda questa password" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Nome utente:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etichetta" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Preferisci sempre le copertine definite dall'utente" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Non scaricare la copertina quando ne esiste una definita dall'utente" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Scarica copertine" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Corpo" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titolo" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Mostra pulsante \"salta traccia\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Durata della visualizzazione delle notifiche" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "secondi" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Aggiungi una cartella di root all'explorer" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Rinomina" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Stato" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Nessuna azione" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Messaggio:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Imposta lo stato su:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Librerie" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Aggiungi una nuova libreria" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Pulisci" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Pulisci la playlist" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Visualizza finestra delle informazioni" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Visualizza preferenze" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tempo trascorso" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Aiuto Online (_H)" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Apre la guida in linea" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Riproduci tutti i file senza fine" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Riproduci la traccia successiva" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Riproduci la traccia precedente" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Esce dall'applicazione" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tempo rimanente" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Cerca una posizione nella traccia corrente" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Seleziona un'explorer" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Riproduzone casuale" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Mischia la playlist" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Modifica" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_File" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Aiuto" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nome:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Percorso:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "File" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Riproduci" ./decibel-audio-player-1.06/po/bg.po0000644000175000017500000010733511456551414017344 0ustar ingelresingelres# Bulgarian translation for decibel-audio-player # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-08-24 13:13+0000\n" "Last-Translator: ivan mikov \n" "Language-Team: Bulgarian \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Номер на запис" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Заглавие" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Изпълнител" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Албум" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Жанр" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Дата" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Номер на диска" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Продължителност в секунди (например, 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Продължителност (например, 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Място на записа в списъка за изпълнение" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Брой записи в списъка за изпълнение" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Пълен път до файла" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Диск %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Неизвестен жанр" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Неизвестно заглавие" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Неизвестен албум" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Неизвестен изпълнител" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Неизвестен албум" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " ivan mikov https://launchpad.net/~ivandm" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Разработчик:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Благодарение на:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Въведете вашето име и парола за\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Изисква се парола" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "За сигурността на съхранение на паролата" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Ако използвате Gnome е безопасно да запазите вашата парола, щом се използва " "ключодържателя на Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Ако не използвате Gnome внимавайте, макар че паролите не се съхраняват като " "обикновен текст, то някой може да я извлече." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Предпочитания" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Този модул не може да бъде зареден." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Модули" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Описание" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Този прозорец показва списък с достъпните модули, които са малки части код, " "добавящи нови функционалности към приложението. Можете да " "включвате/изключвате модула, поставяйки/премахвайки отметката срещу него. " "Обърнете внимание, че някои модули (например, Файловият браузър) не могат да " "бъдат изключени." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Конфигуриране на модул" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Когато модулът може да бъде настройван, в дясно се показва специфична икона. " "За да се настрои модула, просто го изберете и натиснете бутона " "\"Предпочитания\" долу в диалоговия прозорец. Обърнете внимание, че " "настройването на модула е възможно само когато той е включен." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Изберете папка" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Този път не съществува" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Моля изберете съществуваща директория" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Името е неточно" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Това име не е разрешено.\n" "Моля използвайте някое друго." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Използването на символа %s не е разрешено.\n" "Изберете друго име." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Статус на клиента за моментни съобщения" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Обнови съобщението за състояние на вашия IM клиент" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel е спрян" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [паузирано]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Този модул засича всеки работещ IM клиент и обновява вашия статус съобразно " "записа, който слушате. Поддържани IM клиенти са:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Настройка на статуса" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Можете да изберете всякакъв текст за статуса. Преди да го поставите, модулът " "заменя всички полета от вида {поле} с техните съответни значения. Достъпни " "са следните полета:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Маркиране" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Прочистване" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Можете да определите някои думи, които да бъдат прочистени преди да ги " "използвате при поставянето на вашия статус. В този случай средните букви на " "съвпадащите думи автоматично се заменят със звездичка (напр. \"Metallica - " "Live S**t Binge & Purge\"). Поставете по една дума на ред." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Обновява вашият Last.fm профил" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "вашият Last.fm профил" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[паузирано]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Следните модули на Python не са налични:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Трябва да ги инсталирате, ако искате да използвате този модул." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Известие на работния плот" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Покажи известие на работния плот при смяната на записа" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Пропусни записа" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Този модул показва малък изкачащ прозорец на работния плот когато започва " "нов запис." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Параметри на известията" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Паузирай текущият запис" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Изпълни първият запис от списъка" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Продължи изпълнението на текущия запис" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Изберете файловия браузър\n" "от падащото меню." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Дължина" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "Път" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Запазване на списъка" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Изрязване" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "Разбъркай списъка за изпълнение" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "Изчисти списъка за изпълнение" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Повтори" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Запази списъка като..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Файлов браузър" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Прегледайте вашата файлова система" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Начало" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "Root" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "зареждане…" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "Сгъни всичко" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Покажи скритите файлове" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Вие ще можете да добавите тази root папка по-късно, ако пожелаете." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Премахване на избраното?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Вие ще можете да добавите тази root папки по-късно, ако пожелаете." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Премахване на всичко избрано?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Вашите файлове няма да бъдат изтрити." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Този модул позволява да преглеждате файловете на вашия компютър." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Употреба" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "Библиотека" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Организирайте вашата музиката по етикети вместо по файлове" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Създаване на библиотека" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Обновяване на библиотеката" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Директорията се сканира за звукови файлове. Това може да отнеме известно " "време.\n" "Моля, изчакайте." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Създаване на библиотека..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Обновяване на библиотеката..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "Произволност" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "Изберете албум от библиотеката" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Библиотеката е остаряла, обновете я." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "записи" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "По-късно ще може да създадете отново тази библиотека, ако пожелаете." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Премахване на избраната библиотека?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "По-късно ще може да създадете отново тези библиотеки, ако пожелаете." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Премахване на всички избрани библиотеки?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Вашите звукови файлове няма да бъдат премахнати." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Икона за статуса" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Добави икона в областта за уведомяване" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [паузирано]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "Еквалайзер" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "Изисква се рестартиране" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "Трябва да рестартирате приложението за да се отрази промяната." #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "Файлът не може да се зареди" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "Неточен формат на файла" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Аудио CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Пусни аудио дискове" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "изтегляне на данни..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Запис %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Не е намерен диск" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Изчистване на CDDB кеша?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Невалиден път" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Пътя до CD-ROM устройството е невалиден. Моля изберете съществуващ път." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Този модул позволява пускането на аудио дискове от вашето CD-ROM устройство." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "База данни за компакт дискове (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Ако желаете, информацията за диска, като името на изпълнителя и албума, може " "да бъде автоматично изтеглена от онлайн база данни. Тази информация може, " "също така, да бъде запазена на вашия хард диск, за да се избегне повторното " "изтегляне следващият път когато прослушвате същия диск." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "изпълнява %(artist)s\n" "от албума %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Обложки" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Покажи обложките на албумите" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Потребителски обложки" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Обложки от интернет" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Създай текстови файл с текущия статус" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "Пътя до избраният файл е невалиден. Моля изберете съществуващ път." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Изберете файл" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Параметри на файла" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "Обновяване статуса на вашия Twitter профил" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "вашият Twitter профил" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" "Този модул публикува съобщение във вашия Twitter профил, съгласно това, " "което слушате." #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Разни" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM устройство:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Изчистване на кеша" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Свали информация за диска" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Изтегли информацията за диска от онлайн база данни" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Местоположение на CD-ROM устройството" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Премахване на цялата информация за диска от хард диска" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Запазване на информацията за диска на хард диска" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Запазване на информацията в локалния кеш" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Добавяне към списъка" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Повторно сканиране на аудио диска" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Парола:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Запомняне на паролата" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Потребителско име:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "етикет" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Обложки от интернет" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Потребителски обложки" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Винаги предпочитай потребителските обложки" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Не сваляй обложки когато е налична потребителска" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Свали обложки" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Имена на файлове" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Опитай изтеглянето на обложките от интернет" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Заглавие" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Покажи бутон \"пропускане на запис\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "секунди" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Преименуване" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Дали скритите файлове да се показват във файловия браузър" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Прочистени думи" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Състояние" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Не прави нищо" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Съобщение:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Задаване на състоянието:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Обнови при пауза" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Библиотеки" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Добави нова библиотека" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Премахни избраните библиотеки" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Преименувай избраните библиотеки" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Обнови избраната библиотека чрез повторно сканиране на диска" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Изчисти" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Изчисти списъка" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Покажи настройките" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Изтекло време" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Онлайн _помощ" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Отвори страницата в интернет за онлайн помощ" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Изпълни следващият запис" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Изпълни предходният запис" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "Списък за изпълнение" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Спиране на програмата" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Оставащо време" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Търси определено място в текущия запис" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Избери файлов браузър" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Разбъркано" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Разбъркай списъка" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Спри текушият запис" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Редактиране" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Файл" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Помощ" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "_Режим" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Име:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Път:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Файл" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Пусни/Премахни паузата" ./decibel-audio-player-1.06/po/eo.po0000644000175000017500000006044111456551414017353 0ustar ingelresingelres# Esperanto translation for decibel-audio-player # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-08-02 21:24+0000\n" "Last-Translator: kitzOgen \n" "Language-Team: Esperanto \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artisto" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Albumo" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Ĝenro" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Dato" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Numeroj el kantoj en la ludlisto" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Nekonata Ĝenro" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Nekonata Albumo" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Nekonata Artisto" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Nekonata Albumo Artisto" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " kitzOgen https://launchpad.net/~kitzogen" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Dankon al:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Tajpu vian kontnomon kaj pasvorton por\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Pasvorto bezonata" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Agordoj" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Moduloj" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Priskribo" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Elekti dosierujon" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Ĉi nono estas ne permesata.\n" "Bonvolu uzi alian." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" #: ../src/modules/Library.py:30 msgid "Library" msgstr "" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "" #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "" #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "" ./decibel-audio-player-1.06/po/de.po0000644000175000017500000010343611456551414017342 0ustar ingelresingelres# German translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-07-02 03:24+0000\n" "Last-Translator: Michael Kuhn \n" "Language-Team: German \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Titelnummer" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titel" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Interpret" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genre" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Datum" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Disc-Nummer" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Dauer in Sekunden (z.B. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Dauer als Zeichenkette (z.B. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Track-Position in der Playlist" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Anzahl der Tracks in der Playlist" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Vollständiger Dateipfad" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disc %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Unbekanntes Genre" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Unbekannter Titel" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Unbekanntes Album" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Unbekannter Interpret" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Unbekannter Albeninterpret" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " FryK https://launchpad.net/~fryk\n" " Herr K https://launchpad.net/~herr-k-deactivatedaccount\n" " Manuel Proemel https://launchpad.net/~manuel-bgx-mail\n" " Marek Tomczyk https://launchpad.net/~gw-marek-tomczyk\n" " Michael Kuhn https://launchpad.net/~suraia\n" " Raphael Scholer https://launchpad.net/~raphaelscholer\n" " Shaky https://launchpad.net/~shaky2k\n" " Vinzenz Vietzke https://launchpad.net/~v1nz\n" " phil https://launchpad.net/~phil-w-web\n" " timobaumann https://launchpad.net/~timobaumann" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Entwickler:" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Dank an:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Benutzernamen und Passwort eingeben für\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Passwort erforderlich" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Über die Sicherheit der Passwortspeicherung" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Falls GNOME benutzt wird, werden Passwörter sicher im Gnome-Keyring " "gespeichert." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Falls GNOME nicht benutzt wird, könnte ein Angreifer unter Umständen " "an das Passwort gelangen, obwohl es verschlüsselt gespeichert wird." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Einstellungen" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Fehler beim Laden des Moduls." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Module" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Beschreibung" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Dieser Dialog zeigt die verfügbaren Module. Module erweitern das Programm um " "nützliche Funktionen. Einige Module können nicht deaktiviert werden." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Modulkonfiguration" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Konfigurierbare Module sind durch ein passendes Icon gekennzeichnet. Wenn " "ein konfigurierbares Modul ausgewählt ist, können durch Klicken auf den " "\"Einstellungen\"-Knopf modulspezifische Einstellungen vorgenommen werden." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Wählen Sie ein Verzeichnis" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Dieser Pfad existiert nicht" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Bitte wählen Sie ein existierendes Verzeichnis" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Der Name is ungültig." #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Dieser Name kann nicht benutzt werden.\n" "Bitte wählen Sie einen anderen Namen." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Das Zeichen %s kann in Namen nicht benutzt werden.\n" "Bitte wähle einen anderen Namen." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Instant-Messenger-Status" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Den Statustext des Instant Messengers anpassen" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel angehalten" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [pausiert]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Dieses Modul zeigt das gespielte Musikstück im Aktivitätsstatus von " "laufenden Instant Messengern an. Folgende Instant Messenger werden " "unterstützt:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Angezeigten IM-Status anpassen." #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Der Status enthält beliebigen Text und Variablen in geschweiften Klammern " "({Variable}). Variablen werden in der Anzeige durch ihre jeweiligen Werte " "ersetzt. Folgende Variablen werden unterstützt:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Formatierung" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Der Text kann in der Auszeichnungssprache Pango formatiert werden. Für " "Informationen zu Pango siehe:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Bereinigen" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Sie können Wörter festlegen, die zensiert werden, bevor sie als Ihren Status " "gesetzt werden. Die Mittleren Zeichen eines festgelegten Wortes werden dann " "automatisch mit Sternchen erstzt. (z.B. Metallica - Live S**t Binge & " "Purge). Verwenden Sie bitte für jedes Worte eine eigene Zeile." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Halten sie ihr Last.fm-Profil auf dem neuesten Stand" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Ihr Last.fm Konto" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Ein Titel in der Wiedergabeliste [%(length)s]" msgstr[1] "%(count)u Titel in der Wiedergabeliste [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[Pause]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Folgende Python-Module sind nicht verfügbar:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Die notwendigen Python-Module müssen zuerst installiert werden." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Desktop-Benachrichtigung" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Desktop-Benachrichtigung beim Liedwechsel" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Titel überspringen" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Dies Modul zeigt eine Pop-Up-Blase auf dem Desktop an, wenn ein neues Stück " "gespielt wird." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Benachrichtigung anpassen" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Titel und Text der Meldung können frei gewählt werden und Variablen in " "geschweiften Klammern ({Variable}) enthalten. Variablen werden in der " "Anzeige durch ihre jeweiligen Werte ersetzt. Folgende Variablen werden " "unterstützt:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Aktuelles Stück unterbrechen" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Am Anfang der Playlist starten" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Aktuelles Stück weiter abspielen" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "Bitte wählen Sie einen Dateimanager in der Auswahlbox aus." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Dauer" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Wiedergabeliste speichern" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Zuschneiden" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Wiederholen" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Wiedergabeliste speichern unter..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Dateimanager" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Durchsuchen Sie ihr Dateisystem" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Persönlicher Ordner" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "wird geladen…" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Versteckte Dateien anzeigen" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Dieser Ordner kann später wieder hinzugefügt werden." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Den gewählten Eintrag entfernen?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Diese Ordner können später wieder hinzugefügt werden." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Die gewählten Einträge entfernen?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Die Audiodateien werden nicht gelöscht." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "" "Dieses Modul erlaubt es Ihnen, die Dateien auf ihren Laufwerken zu " "durchsuchen." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Verwendung" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Mindestens ein Ordner muss hinzugefügt werden um ihre Dateien zu " "durchsuchen. Dieser Ordner wird dann die Wurzel des Dateimanager-Baumes im " "Hauptfenster." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Musiksammlung" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "" "Musik basierend auf den Tags sortieren, anstatt durch die " "Verzeichnishierarchie" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Musiksammlung wird erstellt" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Musiksammlung wird aktualisiert" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Das Verzeichnis wird nach Mediendateien durchsucht. Dies kann etwas dauern.\n" "Bitte warten." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Verzeichnisse werden durchsucht (ein Titel gefunden)" msgstr[1] "Verzeichnisse werden durchsucht (%(nbtracks)u Titel gefunden)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Erstelle Sammlung..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Aktualisiere Sammlung..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Diese Musiksammlung ist veraltet, bitte aktualisieren." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "Stücke" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" "Sie können diese Sammlung später erstellen, sofern von Ihnen gewünscht." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Ausgewählte Sammlung entfernen?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" "Sie können diese Sammlung später erstellen, sofern von Ihnen gewünscht." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Alle ausgewählten Sammlungen entfernen?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Ihre Mediendateien werden nicht entfernt." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Dieses Modul organisiert Ihre Mediendateien nach Tags anstelle der " "Verzeichnnisstruktur ihres Laufwerkes zu benutzen. Das Laden der Stücke ist " "auch schneller, da ihre Tags schon bekannt sind und nicht noch einmal " "geladen werde müssen." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Wenn Sie eine neue Sammlung hinzufügen, müssen Sie den kompletten Pfad zum " "Wurzelverzeichnis angeben. Danach werden alle Verzeichnisse unter diesem " "Ursprung rekursiv nach Mediendateien durchsucht, deren Tags eingelesen und " "in einer Datenbank gespeichert werden." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Falls eine Sammlung neu geladen wird, wird auch die Dateistruktur unterhalb " "des Wurzelverzeichnisses und alle Mediendateien auf Veränderungen geprüft, " "um die Datenbank entprechend zu aktualisieren." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Statussymbol" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Füge ein Symbol in den Informationsbereich ein" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [pausiert]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "Audio-CD" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Audio-CD abspielen" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "Empfange Daten..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Titel %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Keine Audio-CD gefunden" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "Hiermit werden alle Informationen über die Audio-CD gelöscht." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "CDDB-Cache leeren" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Ungültiger Pfad" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Der Pfad für das CD-ROM Laufwerk ist nicht gültig. Wählen Sie bitte einen " "gültigen." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Dieses Modul ermöglicht es Ihnen Audio-CDs über Ihr CD-ROM Laufwerk " "abzuspielen." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc Data Base (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Wenn Sie es wünschen, können Informationen zur Audio-CD, wie Interpret oder " "Albumtitel, automatisch von einer Online-Datenbank heruntergeladen werden. " "Außerdem können diese Daten auf ihrem Rechner gesichert werden, um in " "Zukunft nicht erneut heruntergeladen werden zu müssen." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "von %(artist)s\n" "auf %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Cover" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Album-Cover anzeigen" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Dieses Modul zeigt das Album-Cover des aktuellen Titels an. Es können Cover " "aus dem Verzeichnis des aktuellen Titels benutzt oder aus dem Internet " "heruntergeladen werden." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Benutzer-Cover" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Ein Benutzer-Cover ist ein Bild im Verzeichnis des aktuellen Titels. " "Dateinamen müssen ohne Erweiterung angegeben werden, es werden automatisch " "unterstützte Dateiformate (%s) benutzt." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Internet-Cover" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Cover können basierend auf den Tags des aktuellen Titels aus dem Internet " "heruntergeladen werden. Optional können immer Benutzer-Cover bevorzugt " "werden. Falls ein Benutzer-Cover zum aktuellen Titel existiert, wird dieses " "verwendet, ansonsten wird ein Cover aus dem Internet heruntergeladen." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Statusdatei" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Eine Textdatei mit dem aktuellen Status generieren" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "Der Pfad zur gewählten Datei ist ungültig. Bitte wählen Sie einen " "existierenden Pfad." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Wählen Sie eine Datei" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Dieses Modul generiert eine Textdatei die das aktuell abgespielte Stück " "enthält." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Datei anpassen" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Sie können den Inhalt der Datei auf einen beliebigen Text ändern. Vor der " "Generierung der Datei werden Felder der Form {feld} durch ihre " "entsprechenden Werte erstzt. Mögliche Felder sind:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Verschiedenes" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "CD-ROM Laufwerk" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Lösche Zwischenspeicher" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Informationen zur Audio-CD herunterladen" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" "Herunterladen der Informationen zur Audio-CD von einer Online-Datenbank" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Pfad zum CD-ROM Laufwerk" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Lösche sämtliche Informationen über die Audio-CD" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Speichere Informationen über die Audio-CD" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Zwischenspeichern der Informationen" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Zur Wiedergabeliste hinzufügen" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Auswahl der Wiedergabeliste hinzufügen" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Die Wiedergabeliste durch diese Auswahl erstzen und abspielen" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Lese die Audio-CD erneut" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Passwort:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "An dieses Passwort erinnern" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Benutzername:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "Beschriftung" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Internet-Cover" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Benutzer-Cover" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Benutzer-Cover immer bevorzugen" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Cover nicht herunterladen, wenn ein Benutzer-Cover existiert" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Cover herunterladen" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Zu benutzende Dateinamen (z. B. »folder« oder »cover«)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Dateinamen:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Versuchen Cover aus dem Internet herunterzuladen" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Body" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titel" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Benachrichtigungsverzögerung:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Zeigen \"Überspringe Titel\" Schaltfläche an" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Zeitraum, in dem die Benachrichtigung angezeigt wird" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "Sekunden" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Wurzelverzeichnisse" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Füge dem Dateimanager ein neues Hauptverzeichnis hinzu" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Entferne die gewählten Hauptverzeichnisse" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Umbenennen" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Ausgewählten Ordner umbenennen" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Ob versteckte Dateien im Dateimanager angezeigt werden sollen" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Bereinigte Wörter" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Beim Stoppen oder Verlassen" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Nichts tun" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Nachricht:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Folgende Statusnachricht anzeigen:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Aktualisieren auch wenn nicht verfügbar" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Aktualisieren wenn pausiert" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Aktualisiere den Status auch, wenn du als unerreichbar markiert bist" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Aktualisiere den Status bei Pause/Abspielen-Ereignissen" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Sammlungen" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Neue Sammlung hinzufügen" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Gewählte Sammlungen entfernen" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Ausgewählte Bibliothek umbenennen" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Aktualisiere die gewählte Sammlung durch Scannen des Laufwerks" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Leeren" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Playliste leeren" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "\"Über\"-Dialogbox anzeigen" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Vorlieben anzeigen" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Abgelaufene Zeit" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Online_hilfe" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Die Onlinehilfe-Webseite öffnen" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Alle Stücke endlos wiedergeben" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Nächstes Stück spielen" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Vorheriges Stück spielen" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Anwendung beenden" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Verbleibende Zeit" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Position im aktuellen Stück suchen" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Dateimanager auswählen" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Zufällige Wiedergabe" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Abspielliste mischen" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Aktuelles Stück stoppen" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Bearbeiten" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Datei" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Hilfe" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Name:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Pfad:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Datei" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Abspielstatus" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Abspielen/Pause" ./decibel-audio-player-1.06/po/pt.po0000644000175000017500000007655011456551414017403 0ustar ingelresingelres# Portuguese translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2008-01-14 02:27+0000\n" "Last-Translator: Sérgio Marques \n" "Language-Team: Portuguese \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Número da faixa" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Título" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artista" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Álbum" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Duração em segundos (ex. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Duração como string (ex. 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Posição da faixa Lista de Reprodução" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Número de Faixas na Lista de Reprodução" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Caminho completo para o ficheiro" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Álbum Desconhecido" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artista Desconhecido" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Luis Reis https://launchpad.net/~luis-marafado\n" " Sérgio Marques https://launchpad.net/~sergio+marques" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Desenvolvedor" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Agradecimentos a:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Palavra-passe necessária" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "A respeito da segurança do armazenamento da palavra-passe" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Se usa o Gnome, é seguro o armazenamento da sua palavra-passe, pois o " "Keyring do Gnome é usado." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Se não usa o Gnome, cuidado que, apesar de não ser guardada como texto, a " "palavra-passe pode ser extraída." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferências" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Incapaz de carregar esta módulo" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Módulos" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descrição" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Esta caixa de diálogo mostra os módulos disponíveis, que são pequenas " "porções de código que adicionam novas funcionalidades à aplicação. Pode " "activar/desactivar um módulo através da marcação/desmarcação da caixa em " "frente deste. de notar que alguns módulos (ex. Explorador Ficheiros) não " "podem ser desactivados." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configurando um Módulo" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Quando é possível configurar um módulo, um ícone específico é mostrado à " "direita da linha correspondente. Para configurar um módulo simplesmente " "seleccione-o e depois clique no botão \"Preferências\" no fundo da caixa de " "diálogo. De notar que a configuração de um módulo só é possível quando este " "está activado." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Seleccione uma pasta" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Este caminho não existe" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Por favor seleccione uma directória existente" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "O nome é incorrecto" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Este nome não é permitido.\n" "Por favor use outro." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "O caracter %s não é permitido.\n" "Por favor use outro nome." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Estado do Messenger Instantâneo" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "Actualizar a mensagem de estado do seu cliente IM" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "O Decibel está parado" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Este módulo detecta qualquer messenger em execução e actualiza o seu estado " "com respeito à faixa que está a ouvir. Os messengers são:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Personalizando o Estado" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Pode definir o estado com qualquer texto que desejar. Antes de o definir, o " "módulo substitui todos os campos no form {campo} pelo seu valor " "correspondente. Campos disponíveis são:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Marcação" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Pode utilizar a Pango markup language para formatar o texto. Mais informação " "nessa linguagem está disponível na seguinte página Web:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Edição" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Pode definir algumas palavras para editar antes de as usar para definir o " "seu estado. Neste caso, os caracteres do meio que são coincidentes são " "automaticamente substituidas com asteriscos (ex.\"Metallica - Live S**t " "Binge & Purge\"). Ponha uma palavra por linha." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Mantenha actualizado o seu perfil do Last.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "A sua conta Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "" msgstr[1] "" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausado]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Os seguintes módulos Python não estão disponíveis" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Tem de instala-los se desejar activar este módulo" #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notificação na Área de Trabalho" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "" "Mostra uma Notificação na Área de Trabalho quando ocorre mudança de faixa" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Ignorar faixa" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Este módulo mostra um pequeno popup na sua área de trabalho quando uma nova " "faixa inicia." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Personalizando a Notificação" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Pode mudar o título e o corpo da notificação para qualquer texto que deseje. " "Antes de mostrar o popup, os campos do form {campo} são substituídos pelo " "seu valor correspondente. Campos disponíveis são:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pausa a faixa actual" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Reproduz a primeira faixa da lista de reprodução" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continua a reprodução da faixa actual" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Por favor seleccione um explorador\n" "na combo box abaixo." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Duração" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Gravar a lista de reprodução" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Cortar" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Repetir" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Gravar Lista de Reprodução Como..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Explorador de Ficheiros" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Navegar pelo seu sistema de ficheiros" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Início" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "" #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Mostrar os ficheiros escondidos" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Deverá ser capaz de adicionar esta pasta de raízdepois se assim o entender." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Remover a entrada seleccionada?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Deverá ser capaz de adicionar estas pastas de raíz depois se assim o " "entender." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Remover todas as entradas seleccionadas" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Os seu ficehrios de media não serão removidos" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Este modo permite-lhe pesquisar os ficheiros nos sues discos." #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Utilização" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Pelo menos uma pasta raíz tem de ser adicionada para navegar no seus " "ficheiros. Essa pasta torna-se depois na raíz do explorador de ficheiros na " "janela principal." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Biblioteca" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organizar a sua música por tags em detrimento de por ficheiros" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Criando a biblioteca" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Actualizando a biblioteca" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "O directório é varrido por ficheiros de media. Pode levar algum tempo.\n" "Por favor aguarde." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "" msgstr[1] "" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Criando biblioteca..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Actualiznado biblioteca..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "" #: ../src/modules/Library.py:663 msgid "tracks" msgstr "faixas" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Será capaz de recriar esta biblioteca mais tarde se assim entender." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Remover a biblioteca seleccionada?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "" "Será capaz de recriar estas bibliotecas mais tarde se assim entender." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Remover todas as bibliotecas seleccionadas?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Os seu ficheiros de media não serão removidos" #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Este módulo organiza os seus ficheiros de media por tags em detrimento de o " "fazer pela estrutura de ficheiros do disco. O carregamento de faixas é mais " "rápido pois as tags já são conhecidas e não têm de ser lidas novamente." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Quando é adicionada uma nova biblioteca, terá de fornecer o caminho completo " "para a pasta raíz dessa biblioteca. Assim, todas as directorias abaixo deste " "caminho são varridas recursivamente por ficheiros de media cujas tags são " "lidas e guardadas na base de dados." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Ícone de Estado" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Adicionar um ícone para a área de notificação" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD Áudio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Tocar discos áudio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "transferindo dados" #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Disco não encontrado" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Isto fará com que toda as informações sobre o disco sejam removidas do disco " "rígido." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Limpar cache CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Caminho inválido" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "O caminho para o dispositivo CD-ROM não é válido. Por favor escolha um " "caminho válido" #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Este modo permite tocar um cd de áudio a partir do dispositivo de CD-ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Ficheiro de Estado" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Gerar um ficheiro de texto com o estado actual" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "" "O caminho para o ficheiro seleccionado não é válido. Por favor escolha um " "caminho existente." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Escolha um ficheiro" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Este módulo gera um ficheiro de texto com referencias à faixa actualmente em " "reprodução." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Personalizando o Ficheiro." #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Pode alterar o conteúdo do ficheiro para qualquer texto que deseja. Antes de " "gerar o ficheiro, os campos do form {campo} são substituídos pelo valor " "correspondente. Os campos disponíveis são:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Vários" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Dispositivo CD-ROM" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Limpar cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Transferir informações sobre o disco" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" "Transferir informações sobre o disco a partir de uma base de dados online" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "localização do seu dispositivo CR-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Guardar informações do disco no disco rígido" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Guardar informações na cache local" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Adicionar à Lista de Rprodução" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Palavra passe:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Recordar esta palavra-passe" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Nome de Utilizador:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "etiqueta" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Corpo" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Título" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Tempo de espera da Notificação:" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Tempo duarante o qual a notificação será mostrada" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "segundos" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Pastas Raíz" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Adicionar uma nova pasta raíz ao explorador de ficheiros" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Remover as pastas raíz seleccionadas" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Renomear" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Renomear a pasta raíz seleccionada" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "" "Se os ficheiros escondidos sevem ser mostrados no explorador de ficheiros" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Editar Palavras" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Estado" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Em paragem ou em Saída" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Não fazer nada" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Mensagem:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Definir estado como:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Actualizar mesmo senão estiver disponível" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Actualizar quando em pausa" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotecas" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Adicionar uma nova biblioteca" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Remover uma biblioteca" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Actualizar a biblioteca seleccionada pelo varrimento do disco" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Limpar" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Limpar a lista de reprodução" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Mostrar caixa de diálogo Sobre" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Mostrar Preferências" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tempo decorrido" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_Ajuda Online" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Abrir a pagina de ajuda online" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Reproduzir a próxima faixa" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Reproduzir a faixa anterior" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Sair da aplicação" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tempo restante" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Procurar uma posição na faixa actual" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Baralhar" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Parar a faixa actual" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Editar" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Ficheiro" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Ajuda" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nome:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Caminho:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Ficheiro" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Estado a tocar" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Reproduzir/Sair de Pausa" ./decibel-audio-player-1.06/po/fr.po0000644000175000017500000010666311456551414017366 0ustar ingelresingelres# French translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-08-23 07:15+0000\n" "Last-Translator: François Ingelrest \n" "Language-Team: French \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Numéro de piste" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Titre" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artiste" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Album" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Genre" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Date" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Numéro de disque" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Durée en secondes (par exemple 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Durée en chaîne de caractères (par exemple 3:14)" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Position du morceau dans la playlist" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Nombre de morceaux dans la playlist" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Chemin d'accès au fichier" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Disque %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Genre inconnu" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Titre inconnu" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Album inconnu" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artiste inconnu" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Artiste de l'album inconnu" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " François Ingelrest https://launchpad.net/~athropos\n" "\n" "Launchpad Contributions:\n" " François Ingelrest https://launchpad.net/~athropos\n" " François Ingelrest https://launchpad.net/~francois-ingelrest" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Développeur :" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Merci à:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Entrez votre login et votre mot de passe pour\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Mot de passe requis" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "À propos de la sécurité des mots de passe" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Si vous utilisez Gnome, votre mot de passe est stocké de manière sécurisée " "dans le trousseau de clefs de Gnome." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Si vous n'utilisez pas Gnome, sachez que bien que votre mot de passe ne soit " "pas stocké de manière lisible, un attaquant pourrait le récupérer." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Préférences" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Impossible de charger ce module" #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Modules" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Description" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Cette boîte de dialogue donne la liste des modules disponibles, un module " "étant un petit morceau de programme ajoutant de nouvelles fonctionnalités à " "l'application. Vous pouvez activer/désactiver un module en cochant/décochant " "la ligne correspondante. Certains modules, comme l'explorateur de fichiers, " "ne sont pas désactivables." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configurer un module" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Quand un module peut être configuré, une icône apparaît à droite de la ligne " "correspondante. Pour configurer un module, sélectionnez-le puis cliquez sur " "le bouton « Préférences » en bas de la boîte de dialogue. Un module ne peut " "être configuré que s'il est activé." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Choisissez un répertoire" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Ce chemin d'accès n'existe pas" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Veuillez choisir un répertoire existant." #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "Le nom est incorrect" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Ce nom n'est pas autorisé.\n" "Veuillez en utiliser un autre." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "Le caractère %s n'est pas autorisé.\n" "Veuillez utiliser un autre nom." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Messagerie instantanée" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" "Met à jour le message de statut de votre client de messagerie instantanée" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel est arrêté" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [en pause]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "Ce module détecte les clients de messagerie instantanée en cours d'exécution " "et met à jour votre statut en fonction de ce que vous êtes en train " "d'écouter. Les clients supportés sont :" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Personnaliser le statut" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Vous pouvez définir le texte de votre choix. Avant de s'en servir, le module " "remplace tous les champs de la forme {champ} par leur valeur. Les champs " "disponibles sont :" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Balisage" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Vous pouvez utiliser le langage de balisage Pango pour formater votre " "message. Il est possible de se documenter sur ce langage grâce à la page Web " "suivante :" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Censure" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Vous pouvez définir des mots à censurer avant qu'ils ne soient utilisés dans " "votre statut. Dans ce cas, les caractères du milieu des mots correspondants " "sont automatiquement remplacés par des étoiles (par exemple \"Metallica - " "Live S**t Binge & Purge\"). Saisissez un mot par ligne." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Met à jour votre profil Last.fm" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "votre compte Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Un morceau dans la playlist [%(length)s]" msgstr[1] "%(count)u morceaux dans la playlist [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[en pause]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Les modules Python suivants ne sont pas disponibles :" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Vous devez les installer si vous désirez activer ce module." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notification" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Affiche un avertissement à chaque changement de morceau" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Sauter ce morceau" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Ce module affiche une petite fenêtre d'avertissement quand un morceau " "commence." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Personnaliser la notification" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Vous pouvez utiliser le texte que vous désirez pour le titre et le contenu " "de la notification. Avant d'afficher la fenêtre, les champs de la forme " "{champ} sont remplacés par la valeur correspondante. Les champs disponibles " "sont :\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Mettre en pause" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Démarrer la lecture de la playlist" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continuer la lecture" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Veuillez choisir un explorateur\n" "dans la liste ci-dessous" #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Durée" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "Chemin d'accès" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Sauver la playlist" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Découper" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "Mélanger la playlist" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "Défaire les changements" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "Effacer la playlist" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Répéter" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Enregistrer la playlist sous..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Explorateur de fichiers" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Vous permet d'explorer vos disques" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Dossier personnel" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "Racine" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "chargement..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "Tout réduire" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Afficher les fichiers cachés" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "" "Vous pourrez ajouter à nouveau ce répertoire racine plus tard si vous le " "désirez." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Supprimer la sélection ?" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "" "Vous pourrez ajouter à nouveau ces répertoires racines plus tard si vous le " "désirez." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Supprimer la sélection ?" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Vos fichiers ne seront pas supprimés" #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Ce module vous permet de parcourir les fichiers de vos disques" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Utilisation" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Au moins un répertoire racine doit être ajouté pour parcourir vos fichiers. " "Ce répertoire devient alors la racine de l'explorateur de fichiers dans la " "fenêtre principale." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Bibliothèque" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organise votre musique par tags plutôt que par fichiers" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Création de la bibliothèque" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Mises à jour de la bibliothèque" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Le répertoire est parcouru de manière récursive pour trouver vos fichiers. " "Cela peut prendre du temps.\n" "Veuillez patienter." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Parcours des répertoires (un seul fichier trouvé)" msgstr[1] "Parcours des répertoires (%(nbtracks)u fichiers trouvés)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Création de la bibliothèque..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Mise à jour de la bibliothèque..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "Aléatoire" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "Choisir un album de %(artist)s" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "Choisir un album de la bibliothèque" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "Cette bibliothèque est obsolète, veuillez la rafraîchir." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "morceaux" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "" "Vous pourrez recréer cette bibliothèque plus tard si vous le désirez." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Supprimer la bibliothèque sélectionnée ?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Vous pourrez recréer ces bibliothèques plus tard si vous le désirez." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Supprimer les bibliothèques sélectionnées ?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Vos fichiers ne seront pas supprimés." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Ce module organise votre musique par tags plutôt que par fichiers. Le " "chargement des morceaux est également plus rapide car les tags sont déjà " "connus et ne doivent pas être relus." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Quand vous créer une nouvelle bibliothèque, vous devez donner le chemin " "d'accès au répertoire racine de cette bibliothèque. Ensuite, tous les " "répertoires se situant sous ce répertoire racine sont parcourus de manière " "récursive pour trouver vos fichiers musicaux, dont les tags sont lus et " "stockés dans une base de données." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Lorsqu'une bibliothèque est mise à jour, la structure de vos fichiers depuis " "le répertoire racine est examinée afin de détecter les changements et de " "mettre à jour la base de données si besoin." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Icône de statut" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Ajoute une icône dans la zone de notification" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [en pause]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "Égaliseur" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "Ajuster le niveau des bandes de fréquence" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "Redémarrage nécessaire" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" "Vous devez redémarrer l'application pour que cette modification prenne effet." #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "Sauver les niveaux" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "Charger les niveaux" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "Impossible de charger le fichier" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "Le format du fichier n'est pas correct" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD audio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Lit les CD audio" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "téléchargement des données..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Piste %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Aucun disque détecté" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Toutes les données des CD audio vont être supprimées de votre disque dur." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Effacer le cache CDDB ?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Chemin d'accès invalide" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "Le chemin d'accès au lecteur CD-ROM est n'est pas correct. Veuillez en " "saisir un autre." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Ce module vous permet de lire les CD audio depuis votre lecteur CD-ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Base de données des CD audio (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Les données des CD audio, comme le nom de l'album, peuvent être " "automatiquement téléchargées depuis une base de données en ligne si vous le " "désirez. Ces informations peuvent également être sauvegardées sur votre " "disque dur afin de ne pas les télécharger de nouveau la prochaine fois que " "vous voudrez lire le même CD." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "par %(artist)s\n" "sur %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Pochettes" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Afficher les pochettes des albums" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Ce module affiche la pochette de l'album dont provient le morceau actuel. " "Les pochettes peuvent provenir d'images situées dans le même répertoire que " "le morceau courant, ou peuvent être téléchargées depuis Internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Pochettes utilisateur" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "Une pochette utilisateur est une image située dans le même répertoire que le " "morceau actuel. Vous n'avez pas besoin de fournir l'extension des noms de " "fichiers, les formats supportés (%s) sont automatiquement utilisés." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Téléchargement de pochettes" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "Les pochettes peuvent être téléchargées depuis Internet, à partir des tags " "du morceau actuel. Vous pouvez choisir de toujours préférer les pochettes " "utilisateur. Dans ce cas, si une pochette utilisateur existe pour le morceau " "actuel, elle est utilisée. S'il n'y en a pas, la pochette est téléchargée." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Fichier de statut" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Génère un fichier texte selon ce que vous écoutez" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "Le chemin d'accès saisi est invalide. Veuillez en donner un correct." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Choisissez un fichier" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "" "Ce module génère un fichier texte en fonction du morceau en cours de lecture." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Personnaliser le fichier" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Vous pouvez choisir le contenu du fichier. Avant de générer celui-ci, les " "champs de la forme {champ} sont remplacés par la valeur correspondante. Les " "champs disponibles sont :\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "Met à jour votre compte Twitter" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "votre compte Twitter" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" "Ce module poste un message sur votre compte Twitter en fonction de ce que " "vous êtes en train d'écouter." #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "ReplayGain" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "Normalise le volume" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Divers" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Lecteur CD-ROM :" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Vider le cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Télécharger les données" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "" "Télécharger les données des CD audio depuis une base de données en ligne" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Emplacement de votre lecteur CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Supprimer de votre disque dur toutes les données des CD audio" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Sauvegarder les données des CD audio sur votre disque dur" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Mettre en cache les données" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Ajouter à la playlist" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Ajouter la sélection à la playlist" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Remplacer la playlist par la sélection et lancer la lecture" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Rescanner le lecteur CD-ROM" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Mot de passe :" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Retenir ce mot de passe" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Identifiant :" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "label" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Téléchargement" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Pochettes Utilisateur" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Toujours préférer les pochettes utilisateurs" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "Ne pas télécharger de pochette quand une pochette utilisateur existe" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Télécharger les pochettes" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Noms de fichiers à rechercher (par exemple folder, cover...)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Fichiers :" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Essayer de télécharger les pochettes depuis Internet" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Contenu" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Titre" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Durée de la notification :" #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Afficher un bouton pour sauter le morceau" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Durée d'affichage de la notification" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "secondes" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Répertoires racines" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Ajouter un nouveau répertoire racine à l'explorateur de fichiers" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Supprimer les répertoires racines sélectionnés" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Renommer" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Renommer les répertoires racines sélectionnés" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Cochez cette case si vous désirez afficher les fichiers cachés" #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Mots censurés" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Statut" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "À l'arrêt ou en quittant" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Ne rien faire" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Message :" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Changer le statut :" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Même si je ne suis pas disponible" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Prendre la pause en compte" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "" "Mettre à jour votre statut même si vous êtes marqué comme non disponible" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Mettre à jour votre statut quand le lecteur est en pause" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliothèques" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Ajouter une nouvelle bibliothèque" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Supprimer les bibliothèques sélectionnées" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Renommer la bibliothèque sélectionnée" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Met à jour la bibliothèque sélectionnée en parcourant le disque" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Effacer" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Vider la playlist" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Afficher la boîte de dialogue « À propos »" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Afficher les préférences" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Temps écoulé" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "Complet" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "Mini" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "Nano" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "_Aide en ligne" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Ouvrir la page Web avec l'aide en ligne" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Répéter la playlist indéfiniment" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Passer au morceau suivant" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Revenir au morceau précédent" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "Playlist" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Quitter l'application" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Temps restant" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Avance/retour rapide" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Sélectionner un explorateur" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Mélanger" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Mélanger la playlist" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Arrêter la lecture" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Édition" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Fichier" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Aide" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "_Mode" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nom :" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Chemin d'accès :" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Fichier" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "Statut" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Lecture/pause" #~ msgid "Refresh this library" #~ msgstr "Mettre à jour cette bibliothèque" #~ msgid "Collapse all nodes of the tree" #~ msgstr "Referme tous les nœuds de l'arbre" #~ msgid "Collapse All" #~ msgstr "Tout refermer" #~ msgid "Show/hide the explorer panel" #~ msgstr "Afficher/cacher l'explorateur" #~ msgid "Show/hide track information" #~ msgstr "Afficher/cacher les informations sur le morceau actuel" #~ msgid "_Explorer" #~ msgstr "Explorateur de fichiers" #~ msgid "_Track Information" #~ msgstr "_Morceau actuel" #~ msgid "_View" #~ msgstr "_Afficher" ./decibel-audio-player-1.06/po/pt_BR.po0000644000175000017500000010305211456551414017752 0ustar ingelresingelres# Brazilian Portuguese translation for decibel-audio-player # Copyright (c) 2007 Rosetta Contributors and Canonical Ltd 2007 # This file is distributed under the same license as the decibel-audio-player package. # FIRST AUTHOR , 2007. # msgid "" msgstr "" "Project-Id-Version: decibel-audio-player\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-08-23 09:18+0200\n" "PO-Revision-Date: 2009-05-13 12:21+0000\n" "Last-Translator: Alexandre Cavedon \n" "Language-Team: Brazilian Portuguese \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-Launchpad-Export-Date: 2009-09-01 15:20+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../src/media/track/__init__.py:46 msgid "Track number" msgstr "Faixa" #: ../src/media/track/__init__.py:47 ../src/modules/Tracklist.py:102 #: ../src/modules/Tracklist.py:418 msgid "Title" msgstr "Título" #: ../src/media/track/__init__.py:48 ../src/modules/Tracklist.py:103 #: ../src/modules/Tracklist.py:419 msgid "Artist" msgstr "Artista" #: ../src/media/track/__init__.py:49 ../src/modules/Tracklist.py:104 #: ../src/modules/Tracklist.py:420 msgid "Album" msgstr "Álbum" #: ../src/media/track/__init__.py:50 ../src/modules/Tracklist.py:106 #: ../src/modules/Tracklist.py:422 msgid "Genre" msgstr "Gênero" #: ../src/media/track/__init__.py:51 ../src/modules/Tracklist.py:107 #: ../src/modules/Tracklist.py:423 msgid "Date" msgstr "Data" #: ../src/media/track/__init__.py:52 msgid "Disc number" msgstr "Número do disco" #: ../src/media/track/__init__.py:53 msgid "Duration in seconds (e.g., 194)" msgstr "Duração em segundos (ex. 194)" #: ../src/media/track/__init__.py:54 msgid "Duration as a string (e.g., 3:14)" msgstr "Duração" #: ../src/media/track/__init__.py:55 msgid "Position of the track in the playlist" msgstr "Posição da faixa na playlist" #: ../src/media/track/__init__.py:56 msgid "Number of tracks in the playlist" msgstr "Número da faixa na playlist" #: ../src/media/track/__init__.py:57 msgid "Full path to the file" msgstr "Caminho completo do arquivo" #: ../src/media/track/__init__.py:147 #, python-format msgid "%(album)s [Disc %(discnum)u]" msgstr "%(album)s [Álbum %(discnum)u]" #: ../src/tools/consts.py:95 msgid "Unknown Genre" msgstr "Gênero Desconhecido" #: ../src/tools/consts.py:96 msgid "Unknown Title" msgstr "Título Desconhecido" #: ../src/tools/consts.py:97 msgid "Unknown Album" msgstr "Álbum Desconhecido" #: ../src/tools/consts.py:98 msgid "Unknown Artist" msgstr "Artista Desconhecido" #: ../src/tools/consts.py:103 msgid "Unknown Album Artist" msgstr "Desconhecido" #: ../src/gui/about.py:39 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Alexandre Cavedon https://launchpad.net/~alexandrecavedon\n" " François Ingelrest https://launchpad.net/~athropos" #: ../src/gui/about.py:43 msgid "Developer:" msgstr "Desenvolvedor" #: ../src/gui/about.py:46 msgid "Thanks to:" msgstr "Agradecimentos a:" #: ../src/gui/authentication.py:131 #, python-format msgid "" "Enter your username and password for\n" "%(reason)s" msgstr "" "Informe seu nome e senha para\n" "%(reason)s" #: ../src/gui/authentication.py:133 ../res/Authentication.glade.h:1 msgid "Password required" msgstr "Senha requerida" #: ../src/gui/authentication.py:170 msgid "About password storage safety" msgstr "Sobre a segurança no armazenamento das senhas" #: ../src/gui/authentication.py:171 msgid "" "If you use Gnome, it is safe to store your password since the Gnome keyring " "is used." msgstr "" "Se você usa Gnome o chaveiro gnome-keyring será usado (forma mais segura de " "armazenamento)." #: ../src/gui/authentication.py:172 msgid "" "If you do not use Gnome, beware that, although not stored as clear text, an " "attacker could retrieve it." msgstr "" "Se você não usa Gnome, cuidado ao armazenar sua senha - pois a mesma será " "gravada utilizando texto puro - e desta forma um invasor pode facilmente " "recuperá-la." #: ../src/gui/preferences.py:39 msgid "Preferences" msgstr "Preferências" #: ../src/gui/preferences.py:102 msgid "Unable to load this module." msgstr "Permitir a abertura deste módulo." #: ../src/gui/preferences.py:109 msgid "Modules" msgstr "Módulos" #: ../src/gui/preferences.py:110 ../src/modules/IMStatus.py:341 #: ../src/modules/DesktopNotification.py:166 #: ../src/modules/FileExplorer.py:562 ../src/modules/Library.py:706 #: ../src/modules/AudioCD.py:374 ../src/modules/Covers.py:429 #: ../src/modules/StatusFile.py:115 ../src/modules/Twitter.py:120 msgid "Description" msgstr "Descrição" #: ../src/gui/preferences.py:111 msgid "" "This dialog box shows the list of available modules, which are small pieces " "of code that add some functionnalities to the application. You can " "enable/disable a module by checking/unchecking the check box in front of it. " "Note that some modules (e.g., the File Explorer) cannot be disabled." msgstr "" "Este diálogo apresenta uma lista dos módulos disponíveis, que são pequenos " "programas que permitem adicionar funcionalidades ao Decibel Audio Player. " "Você pode ativar ou desativar um módulo, marcando/desmarcando a caixa na " "frente dele. Observe que alguns módulos (como por exemplo o File Explorer) " "não podem ser desativados." #: ../src/gui/preferences.py:114 msgid "Configuring a Module" msgstr "Configurar o módulo" #: ../src/gui/preferences.py:115 msgid "" "When a module may be configured, a specific icon is displayed on the right " "of the corresponding line. To configure a module, simply select it and then " "click on the \"Preferences\" button on the bottom of the dialog box. Note " "that configuring a module is only possible when it is enabled." msgstr "" "Quando um módulo permite personalização um determinado ícone é apresentado à " "direita, na linha correspondente. Para configurar um módulo, basta selecioná-" "lo e, em seguida, clicar no botão 'Preferências' (abaixo da caixa de seleção " "de módulos). Note que a configuração de um módulo só é possível quando o " "mesmo estiver ativado." #: ../src/gui/selectPath.py:79 msgid "Choose a folder" msgstr "Escolha um diretório" #: ../src/gui/selectPath.py:96 msgid "This path does not exist" msgstr "Este caminho não existe" #: ../src/gui/selectPath.py:96 msgid "Please select an existing directory." msgstr "Por falor selecione um diretório existente" #: ../src/gui/selectPath.py:99 ../src/gui/selectPath.py:104 msgid "The name is incorrect" msgstr "O nome está incorreto" #: ../src/gui/selectPath.py:99 msgid "" "This name is not allowed.\n" "Please use another one." msgstr "" "Este nome não é permitido.\n" "Por favor utilize outro." #: ../src/gui/selectPath.py:104 #, python-format msgid "" "The character %s is not allowed.\n" "Please use another name." msgstr "" "O caracter %s não é permitido.\n" "Por favor utilizar outro nome." #: ../src/modules/IMStatus.py:25 msgid "Instant Messenger Status" msgstr "Status do Instant Messenger" #: ../src/modules/IMStatus.py:25 msgid "Update the status message of your IM client" msgstr "" "Atualiza a mensagem de status do seu cliente de mensagens instantâneas com o " "artista/faixa atual" #: ../src/modules/IMStatus.py:39 msgid "Decibel is stopped" msgstr "Decibel está parado" #: ../src/modules/IMStatus.py:261 ../src/modules/IMStatus.py:334 #, python-format msgid "%(status)s [paused]" msgstr "%(status)s [pausado]" #: ../src/modules/IMStatus.py:342 msgid "" "This module detects any running instant messenger and updates your status " "with regards to the track you are listening to. Supported messengers are:" msgstr "" "O módulo detecta se há um instant messenger e atualiza seu status com " "informações sobre a faixa e o artista que está sendo tocado. Os cliente " "suportados são:" #: ../src/modules/IMStatus.py:345 ../src/modules/Twitter.py:123 msgid "Customizing the Status" msgstr "Customizar o Status" #: ../src/modules/IMStatus.py:346 ../src/modules/Twitter.py:124 msgid "" "You can set the status to any text you want. Before setting it, the module " "replaces all fields of the form {field} by their corresponding value. " "Available fields are:" msgstr "" "Você pode definir o status da forma como desejar, porém atente-se que " "existem palavras-chave que o módulo automaticamente substitui pela " "informação gerada (artista, música, etc). Os campos disponíveis são:" #: ../src/modules/IMStatus.py:349 ../src/modules/DesktopNotification.py:172 msgid "Markup" msgstr "Marcação" #: ../src/modules/IMStatus.py:350 ../src/modules/DesktopNotification.py:173 msgid "" "You can use the Pango markup language to format the text. More information " "on that language is available on the following web page:" msgstr "" "Você pode usar o Pango markup language para formatar o texto. Mais " "informações sobre a linguagem que está disponível no seguinte endereço:" #: ../src/modules/IMStatus.py:353 msgid "Sanitization" msgstr "Censura" #: ../src/modules/IMStatus.py:354 msgid "" "You can define some words that to sanitize before using them to set your " "status. In this case, the middle characters of matching words is " "automatically replaced with asterisks (e.g., \"Metallica - Live S**t Binge & " "Purge\"). Put one word per line." msgstr "" "Você pode definir algumas palavras que sofrerão censura - e não serão " "exibidas. Neste caso, o meio da palavra correspondente é automaticamente " "substituído por asteriscos (por exemplo, \"Metallica - Live S ** t Binge & " "Purga\"). Apresente uma palavra por linha no box específico." #: ../src/modules/AudioScrobbler.py:28 msgid "Keep your Last.fm profile up to date" msgstr "Mantém seus dados do Last.fm atualizados" #: ../src/modules/AudioScrobbler.py:142 ../src/modules/AudioScrobbler.py:143 msgid "your Last.fm account" msgstr "Sua conta Last.fm" #: ../src/modules/StatusbarTitlebar.py:52 #, python-format msgid "One track in playlist [%(length)s]" msgid_plural "%(count)u tracks in playlist [%(length)s]" msgstr[0] "Uma música na playlist [%(length)s]" msgstr[1] "%(count)u músicas na playlist [%(length)s]" #: ../src/modules/StatusbarTitlebar.py:72 msgid "[paused]" msgstr "[pausado]" #: ../src/modules/__init__.py:75 msgid "The following Python modules are not available:" msgstr "Os seguintes módulos Python não estão disponíveis:" #: ../src/modules/__init__.py:79 msgid "You must install them if you want to enable this module." msgstr "Você deve instalá-los se deseja ativar este módulo." #: ../src/modules/DesktopNotification.py:26 msgid "Desktop Notification" msgstr "Notificação na área de trabalho" #: ../src/modules/DesktopNotification.py:26 msgid "Display a desktop notification on track change" msgstr "Notifica mudanças de faixa" #: ../src/modules/DesktopNotification.py:82 #: ../src/modules/DesktopNotification.py:144 msgid "Skip track" msgstr "Pular faixa" #: ../src/modules/DesktopNotification.py:167 msgid "" "This module displays a small popup window on your desktop when a new track " "starts." msgstr "" "Este módulo permite apresentar um pequeno popup na sua área de trabalho " "quando uma nova faixa é iniciada." #: ../src/modules/DesktopNotification.py:168 msgid "Customizing the Notification" msgstr "Customizar a Notificação" #: ../src/modules/DesktopNotification.py:169 msgid "" "You can change the title and the body of the notification to any text you " "want. Before displaying the popup window, fields of the form {field} are " "replaced by their corresponding value. Available fields are:\n" "\n" msgstr "" "Você pode alterar o título e o corpo da notificação para o texto que " "desejar. Antes de exibir a janela pop-up, os campos entre chaves serão " "substituídos por seus valores correspondentes. Os campos disponíveis são:\n" "\n" #: ../src/modules/CtrlPanel.py:78 ../src/modules/CtrlPanel.py:136 #: ../res/StatusIconMenu.glade.h:2 msgid "Pause the current track" msgstr "Pausar a faixa corrente" #: ../src/modules/CtrlPanel.py:95 ../res/MainWindow.glade.h:12 msgid "Play the first track of the playlist" msgstr "Tocar a primeira faixa da playlist" #: ../src/modules/CtrlPanel.py:130 msgid "Continue playing the current track" msgstr "Continuar tocando a faixa atual" #: ../src/modules/Explorer.py:68 msgid "" "Please select an explorer\n" "in the combo box below." msgstr "" "Por favor selecione o explorer\n" "no combo abaixo." #: ../src/modules/Tracklist.py:105 ../src/modules/Tracklist.py:421 msgid "Length" msgstr "Duração" #: ../src/modules/Tracklist.py:108 msgid "Path" msgstr "" #: ../src/modules/Tracklist.py:258 msgid "Save playlist" msgstr "Salvar playlist" #: ../src/modules/Tracklist.py:300 msgid "Crop" msgstr "Recortar" #: ../src/modules/Tracklist.py:315 msgid "Shuffle Playlist" msgstr "" #: ../src/modules/Tracklist.py:322 msgid "Revert Playlist" msgstr "" #: ../src/modules/Tracklist.py:329 msgid "Clear Playlist" msgstr "" #: ../src/modules/Tracklist.py:338 ../res/MainWindow.glade.h:18 msgid "Repeat" msgstr "Repetir" #: ../src/modules/Tracklist.py:346 msgid "Save Playlist As..." msgstr "Salvar playlist como..." #: ../src/modules/FileExplorer.py:28 msgid "File Explorer" msgstr "Gerenciador de arquivos" #: ../src/modules/FileExplorer.py:28 msgid "Browse your file system" msgstr "Navega no seu sistema de arquivos" #: ../src/modules/FileExplorer.py:32 msgid "Home" msgstr "Pasta Pessoal" #: ../src/modules/FileExplorer.py:32 msgid "Root" msgstr "" #: ../src/modules/FileExplorer.py:180 msgid "loading..." msgstr "carregando..." #: ../src/modules/FileExplorer.py:336 ../src/modules/Library.py:405 msgid "Collapse all" msgstr "" #: ../src/modules/FileExplorer.py:349 ../res/FileExplorer.glade.h:7 msgid "Show hidden files" msgstr "Mostrar arquivos ocultos" #: ../src/modules/FileExplorer.py:503 msgid "" "You will be able to add this root folder again later on if you wish so." msgstr "Você poderá adicionar este diretório raíz depois se desejar." #: ../src/modules/FileExplorer.py:504 msgid "Remove the selected entry?" msgstr "Remover a entrada selecionada" #: ../src/modules/FileExplorer.py:506 msgid "" "You will be able to add these root folders again later on if you wish so." msgstr "Você poderá adicionar este diretório raíz depois se desejar." #: ../src/modules/FileExplorer.py:507 msgid "Remove all selected entries?" msgstr "Remover todas entradas selecionada" #: ../src/modules/FileExplorer.py:509 msgid "Your media files will not be deleted." msgstr "Seus arquivos não serão excluídos." #: ../src/modules/FileExplorer.py:563 msgid "This module allows you to browse the files on your drives." msgstr "Este módulo permite navegar nos arquivos do seu HD" #: ../src/modules/FileExplorer.py:564 ../src/modules/Library.py:709 msgid "Usage" msgstr "Uso" #: ../src/modules/FileExplorer.py:565 msgid "" "At least one root folder must be added to browse your files. This folder " "then becomes the root of the file explorer tree in the main window." msgstr "" "Pelo menos um diretório raiz deve ser adicionado ao navegar seus arquivos." #: ../src/modules/Library.py:30 msgid "Library" msgstr "Biblioteca" #: ../src/modules/Library.py:30 msgid "Organize your music by tags instead of files" msgstr "Organize suas músicas pelas tags dos arquivos" #: ../src/modules/Library.py:167 msgid "Creating library" msgstr "Criar biblioteca" #: ../src/modules/Library.py:168 msgid "Refreshing library" msgstr "Atualizar biblioteca" #: ../src/modules/Library.py:170 msgid "" "The directory is scanned for media files. This can take some time.\n" "Please wait." msgstr "" "Este diretório é constantemente varrido atrás de novas músicas - e isso pode " "demorar alguns minutos.\n" "Por favor aguarde." #: ../src/modules/Library.py:221 #, python-format msgid "Scanning directories (one track found)" msgid_plural "Scanning directories (%(nbtracks)u tracks found)" msgstr[0] "Buscando (uma faixa encontrada)" msgstr[1] "Buscando (%(nbtracks)u faixas encontradas)" #: ../src/modules/Library.py:232 msgid "Creating library..." msgstr "Criando biblioteca..." #: ../src/modules/Library.py:233 msgid "Refreshing library..." msgstr "Atualizando biblioteca..." #: ../src/modules/Library.py:417 msgid "Randomness" msgstr "" #: ../src/modules/Library.py:424 #, python-format msgid "Pick an album of %(artist)s" msgstr "" #: ../src/modules/Library.py:429 msgid "Pick an album in the library" msgstr "" #: ../src/modules/Library.py:446 msgid "This library is deprecated, please refresh it." msgstr "A biblioteca é antiga, por favor atualize-a." #: ../src/modules/Library.py:663 msgid "tracks" msgstr "faixas" #: ../src/modules/Library.py:671 msgid "You will be able to recreate this library later on if you wish so." msgstr "Você poderá adicionar este diretório raíz depois se desejar." #: ../src/modules/Library.py:672 msgid "Remove the selected library?" msgstr "Remover a biblioteca selecionada?" #: ../src/modules/Library.py:674 msgid "You will be able to recreate these libraries later on if you wish so." msgstr "Você poderá adicionar este diretório raíz depois se desejar." #: ../src/modules/Library.py:675 msgid "Remove all selected libraries?" msgstr "Remover todas bibliotecas selecionadas?" #: ../src/modules/Library.py:677 msgid "Your media files will not be removed." msgstr "Seus arquivos de música não serão removidos." #: ../src/modules/Library.py:707 msgid "" "This module organizes your media files by tags instead of using the file " "structure of your drive. Loading tracks is also faster because their tags " "are already known and do not have to be read again." msgstr "" "Este módulo organiza seus arquivos por tags em vez de utilizar a estrutura " "de diretórios. O carregamento de faixas também fica mais rápido, pois suas " "tags já serão reconhecidas, não sendo necessário carregá-las novamente." #: ../src/modules/Library.py:710 msgid "" "When you add a new library, you have to give the full path to the root " "directory of that library. Then, all directories under this root path are " "recursively scanned for media files whose tags are read and stored in a " "database." msgstr "" "Quando uma nova biblioteca é adicionada o caminho completo deve ser " "informado, pois todos diretórios sob este caminho são recursivamente " "verificados e armazenados em um banco de dados." #: ../src/modules/Library.py:712 msgid "" "Upon refreshing a library, the file structure under the root directory and " "all media files are scanned for changes, to update the database accordingly." msgstr "" "Após atualizar uma biblioteca, toda estrutura de diretórios é novamente " "verificadas para atualizar o banco de dados, deixando-o em conformidade com " "sua alteração." #: ../src/modules/StatusIcon.py:24 msgid "Status Icon" msgstr "Ícone de Status" #: ../src/modules/StatusIcon.py:24 msgid "Add an icon to the notification area" msgstr "Exibe um ícone na bandeja da área de notificação" #: ../src/modules/StatusIcon.py:113 #, python-format msgid "%(tooltip)s [paused]" msgstr "%(tooltip)s [pausado]" #: ../src/modules/Equalizer.py:24 msgid "Equalizer" msgstr "" #: ../src/modules/Equalizer.py:24 msgid "Tune the level of the frequency bands" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "Restart required" msgstr "" #: ../src/modules/Equalizer.py:60 ../src/modules/Equalizer.py:62 #: ../src/modules/ReplayGain.py:44 msgid "" "You must restart the application for this modification to take effect." msgstr "" #: ../src/modules/Equalizer.py:95 msgid "Save levels" msgstr "" #: ../src/modules/Equalizer.py:106 msgid "Load levels" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "Could not load the file" msgstr "" #: ../src/modules/Equalizer.py:132 msgid "The format of the file is incorrect." msgstr "" #: ../src/modules/AudioCD.py:27 msgid "Audio CD" msgstr "CD de Áudio" #: ../src/modules/AudioCD.py:27 msgid "Play audio discs" msgstr "Toca CDs de música" #: ../src/modules/AudioCD.py:149 msgid "downloading data..." msgstr "Atualizando dados..." #: ../src/modules/AudioCD.py:153 #, python-format msgid "Track %02u" msgstr "Faixa %02u" #: ../src/modules/AudioCD.py:238 msgid "No disc found" msgstr "Nenhum disco encontrado" #: ../src/modules/AudioCD.py:346 msgid "This will remove all disc information stored on your hard drive." msgstr "" "Remove todas as informações (de discos) armazenadas no seu computador." #: ../src/modules/AudioCD.py:347 msgid "Clear CDDB cache?" msgstr "Limpar o cache do CDDB?" #: ../src/modules/AudioCD.py:360 ../src/modules/StatusFile.py:93 msgid "Invalid path" msgstr "Caminho inválido" #: ../src/modules/AudioCD.py:361 msgid "" "The path to the CD-ROM device is not valid. Please choose an existing path." msgstr "" "O caminho do dispositivo de CD-ROM é inválido. Por favor informe um novo " "caminho." #: ../src/modules/AudioCD.py:375 msgid "This module lets you play audio discs from your CD-ROM device." msgstr "" "Este módulo permite reproduzir discos de áudio a partir do seu dispositivo " "de CD-ROM." #: ../src/modules/AudioCD.py:376 msgid "Compact Disc Data Base (CDDB)" msgstr "Compact Disc Data Base (CDDB)" #: ../src/modules/AudioCD.py:377 msgid "" "Disc information, such as artist and album title, may be automatically " "downloaded from an online database if you wish so. This information may also " "be saved on your hard drive to avoid downloading it again the next time you " "play the same disc." msgstr "" "Informações do disco, tal como o artista e o título do álbum, podem ser " "automaticamente descarregados a partir de uma linha base, se assim desejar. " "Estas informações também podem ser armazenadas no seu HD para evitar um novo " "download na próxima vez em que você tocar o mesmo disco." #: ../src/modules/TrackPanel.py:120 #, python-format msgid "" "by %(artist)s\n" "from %(album)s" msgstr "" "por %(artist)s\n" "em %(album)s" #: ../src/modules/Covers.py:27 msgid "Covers" msgstr "Covers" #: ../src/modules/Covers.py:27 msgid "Show album covers" msgstr "Mostra artes de capa" #: ../src/modules/Covers.py:430 msgid "" "This module displays the cover of the album the current track comes from. " "Covers may be loaded from local pictures, located in the same directory as " "the current track, or may be downloaded from the Internet." msgstr "" "Este módulo apresenta a capa do álbum referente à faixa que está sendo " "tocada. As capas mostradas devem estar armazenadas localmente, no mesmo " "diretório da faixa, podendo ainda serem baixada da internet." #: ../src/modules/Covers.py:433 msgid "User Covers" msgstr "Imagens e informações do artista" #: ../src/modules/Covers.py:434 #, python-format msgid "" "A user cover is a picture located in the same directory as the current " "track. When specifying filenames, you do not need to provide file " "extensions, supported file formats (%s) are automatically used." msgstr "" "A arte da capa do álbum é um arquivo localizado no mesmo diretório da(s) " "faixa(s). Quando o nome do arquivo for informando não há necessidade de " "informar também a extensão, visto que os formatos (%s) são automaticamente " "utilizados." #: ../src/modules/Covers.py:437 msgid "Internet Covers" msgstr "Artes de capa da internet" #: ../src/modules/Covers.py:438 msgid "" "Covers may be downloaded from the Internet, based on the tags of the current " "track. You can ask to always prefer user covers to Internet ones. In this " "case, if a user cover exists for the current track, it is used. If there is " "none, the cover is downloaded." msgstr "" "As artes de capa podem ser baixadas da internet, baseadas nas tags da faixa " "corrente. Para que isso aconteça há necessidade das tags da faixa estarem " "corretamente preenchidas. Neste caso se existir um arquivo local, este será " "usado - caso contrário a arte será baixada da internet." #: ../src/modules/StatusFile.py:25 msgid "Status File" msgstr "Arquivo de Status" #: ../src/modules/StatusFile.py:25 msgid "Generate a text file with the current status" msgstr "Gera um arquivo texto com o status da música que está tocando" #: ../src/modules/StatusFile.py:93 msgid "" "The path to the selected file is not valid. Please choose an existing path." msgstr "O caminho informado não é válido. Por favor informe um novo caminho." #: ../src/modules/StatusFile.py:106 msgid "Choose a file" msgstr "Escolha um arquivo" #: ../src/modules/StatusFile.py:116 msgid "" "This module generates a text file with regards to the track currently played." msgstr "Este módulo gera um arquivo texto com a faixa tocada." #: ../src/modules/StatusFile.py:117 msgid "Customizing the File" msgstr "Customizar este Arquivo" #: ../src/modules/StatusFile.py:118 msgid "" "You can change the content of the file to any text you want. Before " "generating the file, fields of the form {field} are replaced by their " "corresponding value. Available fields are:\n" "\n" msgstr "" "Você pode alterar o conteúdo do arquivo para qualquer texto que você deseja. " "Antes de gerar o arquivo, os campos que estão entre chaves serão " "substituídos por seus valores correspondentes. Os campos disponíveis são:\n" "\n" #: ../src/modules/Twitter.py:27 msgid "Update the status of your Twitter account" msgstr "" #: ../src/modules/Twitter.py:51 msgid "your Twitter account" msgstr "" #: ../src/modules/Twitter.py:121 msgid "" "This module posts a message to your Twitter account according to what you " "are listening to." msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "ReplayGain" msgstr "" #: ../src/modules/ReplayGain.py:25 msgid "Normalize volume" msgstr "" #: ../res/AudioCD.glade.h:1 msgid "CDDB" msgstr "CDDB" #: ../res/AudioCD.glade.h:2 ../res/DesktopNotification.glade.h:2 #: ../res/FileExplorer.glade.h:1 msgid "Miscellaneous" msgstr "Diversos" #: ../res/AudioCD.glade.h:3 msgid "CD-ROM device:" msgstr "Dispositivo de CD-ROM:" #: ../res/AudioCD.glade.h:4 msgid "Clear cache" msgstr "Limpar cache" #: ../res/AudioCD.glade.h:5 msgid "Download disc information" msgstr "Baixar informações do disco" #: ../res/AudioCD.glade.h:6 msgid "Download disc information from an online database" msgstr "Baixar informações do disco diretamente do banco de dados online" #: ../res/AudioCD.glade.h:7 msgid "Location of your CD-ROM device" msgstr "Local do seu drive de CD-ROM" #: ../res/AudioCD.glade.h:8 msgid "Remove all disc information from your hard drive" msgstr "Remover todas informações de discos armazenadas no seu HD" #: ../res/AudioCD.glade.h:9 msgid "Save disc information on your hard drive" msgstr "Salvar informações do disco no seu HD" #: ../res/AudioCD.glade.h:10 msgid "Save information in a local cache" msgstr "Salvar informações no cache local" #: ../res/AudioCDMenu.glade.h:1 msgid "Add to Playlist" msgstr "Adicionar na Lista de Reprodução" #: ../res/AudioCDMenu.glade.h:2 msgid "Append selection to the playlist" msgstr "Acrescentar a seleção de músicas" #: ../res/AudioCDMenu.glade.h:3 msgid "Replace the playlist by the selection and start playback" msgstr "Substituir a playlist pela seleção e iniciar a reprodução" #: ../res/AudioCDMenu.glade.h:4 msgid "Rescan the audio disc" msgstr "Reler o disco de áudio" #: ../res/Authentication.glade.h:2 msgid "Password:" msgstr "Senha:" #: ../res/Authentication.glade.h:3 msgid "Remember this password" msgstr "Lembrar esta senha" #: ../res/Authentication.glade.h:4 msgid "Username:" msgstr "Nome do usuário:" #: ../res/Authentication.glade.h:5 ../res/Progress.glade.h:1 msgid "label" msgstr "rótulo" #: ../res/Covers.glade.h:1 msgid "Internet Covers" msgstr "Artes de capa copiadas da internet" #: ../res/Covers.glade.h:2 msgid "User Covers" msgstr "Artes de capa do Usuário" #: ../res/Covers.glade.h:3 msgid "Always prefer user covers" msgstr "Todos preferem utilizar arte de capa" #: ../res/Covers.glade.h:4 msgid "Don't download covers when there is a user one" msgstr "" "Não realizar o download das artes de capa quando há somente um usuário" #: ../res/Covers.glade.h:5 msgid "Download covers" msgstr "Realizar download das artes de capa" #: ../res/Covers.glade.h:6 msgid "Filenames to look for (e.g., folder, cover)" msgstr "Nomes de arquivo a serem verificados (ex. folder, cover, capa)" #: ../res/Covers.glade.h:7 msgid "Filenames:" msgstr "Nomes de arquivo:" #: ../res/Covers.glade.h:8 msgid "Try to download covers from the Internet" msgstr "Tentar realizar o download das artes de capa" #: ../res/DesktopNotification.glade.h:1 msgid "Body" msgstr "Body" #: ../res/DesktopNotification.glade.h:3 msgid "Title" msgstr "Título" #: ../res/DesktopNotification.glade.h:4 msgid "Notification timeout:" msgstr "Tempo de notificação esgotado." #: ../res/DesktopNotification.glade.h:5 msgid "Show a \"skip track\" button" msgstr "Mostrar o botão de \"pular faixa\"" #: ../res/DesktopNotification.glade.h:6 msgid "Time during which the notification is displayed" msgstr "Período durante a qual a notificação é exibida" #: ../res/DesktopNotification.glade.h:7 msgid "seconds" msgstr "segundos" #: ../res/FileExplorer.glade.h:2 msgid "Root Folders" msgstr "Diretórios Raízes" #: ../res/FileExplorer.glade.h:3 msgid "Add a new root folder to the file explorer" msgstr "Adicionar um novo diretório raíz no navegador de arquivos" #: ../res/FileExplorer.glade.h:4 msgid "Remove the selected root folders" msgstr "Remover os diretórios selecionados" #: ../res/FileExplorer.glade.h:5 ../res/Library.glade.h:4 msgid "Rename" msgstr "Renomear" #: ../res/FileExplorer.glade.h:6 msgid "Rename the selected root folder" msgstr "Renomear o diretório raíz selecionado" #: ../res/FileExplorer.glade.h:8 msgid "Whether hidden files should be shown in the file explorer" msgstr "Arquivos ocultos devem ser apresentados." #: ../res/IMStatus.glade.h:1 msgid "Sanitized Words" msgstr "Palavras Censuradas" #: ../res/IMStatus.glade.h:2 ../res/Twitter.glade.h:1 msgid "Status" msgstr "Status" #: ../res/IMStatus.glade.h:3 msgid "When Stopping or Quitting" msgstr "Quando Parar ou Sair" #: ../res/IMStatus.glade.h:4 msgid "Do nothing" msgstr "Não fazer nada" #: ../res/IMStatus.glade.h:5 ../res/Twitter.glade.h:2 msgid "Message:" msgstr "Mensagem:" #: ../res/IMStatus.glade.h:6 msgid "Set status to:" msgstr "Definir status para:" #: ../res/IMStatus.glade.h:7 msgid "Update even if not available" msgstr "Atualizar mesmo se não disponível" #: ../res/IMStatus.glade.h:8 msgid "Update when paused" msgstr "Atualizar quando pausado" #: ../res/IMStatus.glade.h:9 msgid "Update your status even if you are marked as unavailable" msgstr "Atualizar o status mesmo quando marcado como ausente" #: ../res/IMStatus.glade.h:10 msgid "Update your status on pause/unpause events" msgstr "Atualizar seu status em eventos pausa/toca" #: ../res/Library.glade.h:1 msgid "Libraries" msgstr "Bibliotecas" #: ../res/Library.glade.h:2 msgid "Add a new library" msgstr "Adicionar a nova biblioteca" #: ../res/Library.glade.h:3 msgid "Remove the selected libraries" msgstr "Remover a biblioteca selecionada" #: ../res/Library.glade.h:5 msgid "Rename the selected library" msgstr "Renomear a biblioteca selecionada" #: ../res/Library.glade.h:6 msgid "Update the selected library by rescanning the disk" msgstr "Atualizar a biblioteca selecionada de acordo com a verificação do HD" #: ../res/MainWindow.glade.h:1 msgid "Clear" msgstr "Limpar" #: ../res/MainWindow.glade.h:2 msgid "Clear the playlist" msgstr "Limpar a playlist" #: ../res/MainWindow.glade.h:3 msgid "Display about dialog box" msgstr "Apresentar a tela \"sobre\"" #: ../res/MainWindow.glade.h:4 ../res/StatusIconMenu.glade.h:1 msgid "Display preferences" msgstr "Mostrar preferências" #: ../res/MainWindow.glade.h:5 msgid "Elapsed time" msgstr "Tempo decorrido" #: ../res/MainWindow.glade.h:6 msgid "Full" msgstr "" #: ../res/MainWindow.glade.h:7 msgid "Mini" msgstr "" #: ../res/MainWindow.glade.h:8 msgid "Nano" msgstr "" #: ../res/MainWindow.glade.h:9 msgid "Online _Help" msgstr "Ajuda Online" #: ../res/MainWindow.glade.h:10 msgid "Open the online help web page" msgstr "Abrir a ajuda online" #: ../res/MainWindow.glade.h:11 msgid "Play all tracks endlessly" msgstr "Tocar todas as faixas interminavelmente" #: ../res/MainWindow.glade.h:13 ../res/StatusIconMenu.glade.h:3 msgid "Play the next track" msgstr "Tocar a próxima faixa" #: ../res/MainWindow.glade.h:14 ../res/StatusIconMenu.glade.h:4 msgid "Play the previous track" msgstr "Tocar a faixa anterior" #: ../res/MainWindow.glade.h:15 msgid "Playlist" msgstr "" #: ../res/MainWindow.glade.h:16 ../res/StatusIconMenu.glade.h:6 msgid "Quit the application" msgstr "Sair da aplicação" #: ../res/MainWindow.glade.h:17 msgid "Remaining time" msgstr "Tempo restante" #: ../res/MainWindow.glade.h:19 msgid "Seek a position in the current track" msgstr "Navegue na posição da música que está tocando" #: ../res/MainWindow.glade.h:20 msgid "Select an explorer" msgstr "Selecione um navegador" #: ../res/MainWindow.glade.h:21 msgid "Shuffle" msgstr "Aleatório" #: ../res/MainWindow.glade.h:22 msgid "Shuffle the playlist" msgstr "Embaralhar a playlist" #: ../res/MainWindow.glade.h:23 ../res/StatusIconMenu.glade.h:7 msgid "Stop the current track" msgstr "Parar a faixa atual" #: ../res/MainWindow.glade.h:24 msgid "_Edit" msgstr "_Editar" #: ../res/MainWindow.glade.h:25 msgid "_File" msgstr "_Arquivo" #: ../res/MainWindow.glade.h:26 msgid "_Help" msgstr "_Ajuda" #: ../res/MainWindow.glade.h:27 msgid "_Mode" msgstr "" #: ../res/SelectPath.glade.h:1 msgid "Name:" msgstr "Nome:" #: ../res/SelectPath.glade.h:2 msgid "Path:" msgstr "Caminho:" #: ../res/StatusFile.glade.h:1 msgid "File" msgstr "Arquivo" #: ../res/StatusFile.glade.h:2 msgid "Playing Status" msgstr "" #: ../res/StatusIconMenu.glade.h:5 msgid "Play/Unpause" msgstr "Tocar/Sem pausa"