gpodder-3.5.2/0000755000175000017500000000000012220346122012547 5ustar thpthp00000000000000gpodder-3.5.2/bin/0000755000175000017500000000000012220346122013317 5ustar thpthp00000000000000gpodder-3.5.2/bin/gpo0000755000175000017500000006474012220076757014063 0ustar thpthp00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpo - A better command-line interface to gPodder using the gPodder API # by Thomas Perl ; 2009-05-07 """ Usage: gpo [--verbose|-v] [COMMAND] [params...] - Subscription management - subscribe URL [TITLE] Subscribe to a new feed at URL (as TITLE) search QUERY Search the gpodder.net directory for QUERY toplist Show the gpodder.net top-subscribe podcasts import FILENAME|URL Subscribe to all podcasts in an OPML file export FILENAME Export all subscriptions to an OPML file rename URL TITLE Rename feed at URL to TITLE unsubscribe URL Unsubscribe from feed at URL enable URL Enable feed updates for the feed at URL disable URL Disable feed updates for the feed at URL info URL Show information about feed at URL list List all subscribed podcasts update [URL] Check for new episodes (all or only at URL) - Episode management - download [URL] Download new episodes (all or only from URL) pending [URL] List new episodes (all or only from URL) episodes [URL] List episodes (all or only from URL) - Configuration - set [key] [value] List one (all) keys or set to a new value - Other commands - youtube URL Resolve the YouTube URL to a download URL rewrite OLDURL NEWURL Change the feed URL of [OLDURL] to [NEWURL] webui [public] Start gPodder's Web UI server (public = listen on all network interfaces) pipe Start gPodder in pipe-based IPC server mode """ from __future__ import print_function import sys import collections import os import re import inspect import functools try: import readline except ImportError: readline = None import shlex import pydoc import logging try: import termios import fcntl import struct except ImportError: termios = None fcntl = None struct = None # A poor man's argparse/getopt - but it works for our use case :) verbose = False for flag in ('-v', '--verbose'): if flag in sys.argv: sys.argv.remove(flag) verbose = True break gpodder_script = sys.argv[0] if os.path.islink(gpodder_script): gpodder_script = os.readlink(gpodder_script) gpodder_dir = os.path.join(os.path.dirname(gpodder_script), '..') prefix = os.path.abspath(os.path.normpath(gpodder_dir)) src_dir = os.path.join(prefix, 'src') if os.path.exists(os.path.join(src_dir, 'gpodder', '__init__.py')): # Run gPodder from local source folder (not installed) sys.path.insert(0, src_dir) import gpodder _ = gpodder.gettext N_ = gpodder.ngettext gpodder.images_folder = os.path.join(prefix, 'share', 'gpodder', 'images') gpodder.prefix = prefix # This is the command-line UI variant gpodder.ui.cli = True # Platform detection (i.e. MeeGo 1.2 Harmattan, etc..) gpodder.detect_platform() have_ansi = sys.stdout.isatty() and not gpodder.ui.win32 interactive_console = sys.stdin.isatty() and sys.stdout.isatty() is_single_command = False from gpodder import log log.setup(verbose) from gpodder import core from gpodder import download from gpodder import my from gpodder import opml from gpodder import util from gpodder import youtube from gpodder.config import config_value_to_string def incolor(color_id, s): if have_ansi and cli._config.ui.cli.colors: return '\033[9%dm%s\033[0m' % (color_id, s) return s def safe_print(*args, **kwargs): def convert(arg): return unicode(util.convert_bytes(arg)) ofile = kwargs.get('file', sys.stdout) output = u' '.join(map(convert, args)) if ofile.encoding is None: output = util.sanitize_encoding(output) else: output = output.encode(ofile.encoding, 'replace') try: ofile.write(output) except Exception, e: print(""" *** ENCODING FAIL *** Please report this to http://bugs.gpodder.org/: args = %s map(convert, args) = %s Exception = %s """ % (repr(args), repr(map(convert, args)), e)) ofile.write(kwargs.get('end', os.linesep)) ofile.flush() # On Python 3 the encoding insanity is gone, so our safe_print() # function simply becomes the normal print() function. Good stuff! if sys.version_info >= (3,): safe_print = print # ANSI Colors: red = 1, green = 2, yellow = 3, blue = 4 inred, ingreen, inyellow, inblue = (functools.partial(incolor, x) for x in range(1, 5)) def FirstArgumentIsPodcastURL(function): """Decorator for functions that take a podcast URL as first arg""" setattr(function, '_first_arg_is_podcast', True) return function def get_terminal_size(): if None in (termios, fcntl, struct): return (80, 24) s = struct.pack('HHHH', 0, 0, 0, 0) stdout = sys.stdout.fileno() x = fcntl.ioctl(stdout, termios.TIOCGWINSZ, s) rows, cols, xp, yp = struct.unpack('HHHH', x) return rows, cols class gPodderCli(object): COLUMNS = 80 EXIT_COMMANDS = ('quit', 'exit', 'bye') def __init__(self): self.core = core.Core() self._db = self.core.db self._config = self.core.config self._model = self.core.model self._current_action = '' self._commands = dict((name.rstrip('_'), func) for name, func in inspect.getmembers(self) if inspect.ismethod(func) and not name.startswith('_')) self._prefixes, self._expansions = self._build_prefixes_expansions() self._prefixes.update({'?': 'help'}) self._valid_commands = sorted(self._prefixes.values()) gpodder.user_extensions.on_ui_initialized(self.core.model, self._extensions_podcast_update_cb, self._extensions_episode_download_cb) def _build_prefixes_expansions(self): prefixes = {} expansions = collections.defaultdict(list) names = sorted(self._commands.keys()) names.extend(self.EXIT_COMMANDS) # Generator for all prefixes of a given string (longest first) # e.g. ['gpodder', 'gpodde', 'gpodd', 'gpod', 'gpo', 'gp', 'g'] mkprefixes = lambda n: (n[:x] for x in xrange(len(n), 0, -1)) # Return True if the given prefix is unique in "names" is_unique = lambda p: len([n for n in names if n.startswith(p)]) == 1 for name in names: is_still_unique = True unique_expansion = None for prefix in mkprefixes(name): if is_unique(prefix): unique_expansion = '[%s]%s' % (prefix, name[len(prefix):]) prefixes[prefix] = name continue if unique_expansion is not None: expansions[prefix].append(unique_expansion) continue return prefixes, expansions def _extensions_podcast_update_cb(self, podcast): self._info(_('Podcast update requested by extensions.')) self._update_podcast(podcast) def _extensions_episode_download_cb(self, episode): self._info(_('Episode download requested by extensions.')) self._download_episode(episode) def _start_action(self, msg, *args): line = util.convert_bytes(msg % args) if len(line) > self.COLUMNS-7: line = line[:self.COLUMNS-7-3] + '...' else: line = line + (' '*(self.COLUMNS-7-len(line))) self._current_action = line safe_print(self._current_action, end='') def _update_action(self, progress): if have_ansi: progress = '%3.0f%%' % (progress*100.,) result = '['+inblue(progress)+']' safe_print('\r' + self._current_action + result, end='') def _finish_action(self, success=True, skip=False): if skip: result = '['+inyellow('SKIP')+']' elif success: result = '['+ingreen('DONE')+']' else: result = '['+inred('FAIL')+']' if have_ansi: safe_print('\r' + self._current_action + result) else: safe_print(result) self._current_action = '' def _atexit(self): self.core.shutdown() # ------------------------------------------------------------------- def import_(self, url): for channel in opml.Importer(url).items: self.subscribe(channel['url'], channel.get('title')) def export(self, filename): podcasts = self._model.get_podcasts() opml.Exporter(filename).write(podcasts) def get_podcast(self, url, create=False, check_only=False): """Get a specific podcast by URL Returns a podcast object for the URL or None if the podcast has not been subscribed to. """ url = util.normalize_feed_url(url) if url is None: self._error(_('Invalid url: %s') % url) return None # Subscribe to new podcast if create: return self._model.load_podcast(url, create=True, max_episodes=self._config.max_episodes_per_feed) # Load existing podcast for podcast in self._model.get_podcasts(): if podcast.url == url: return podcast if not check_only: self._error(_('You are not subscribed to %s.') % url) return None def subscribe(self, url, title=None): existing = self.get_podcast(url, check_only=True) if existing is not None: self._error(_('Already subscribed to %s.') % existing.url) return True try: podcast = self.get_podcast(url, create=True) if podcast is None: self._error(_('Cannot subscribe to %s.') % url) return True if title is not None: podcast.rename(title) podcast.save() except Exception, e: logger.warn('Cannot subscribe: %s', e, exc_info=True) if hasattr(e, 'strerror'): self._error(e.strerror) else: self._error(str(e)) return True self._db.commit() self._info(_('Successfully added %s.' % url)) return True def _print_config(self, search_for): for key in self._config.all_keys(): if search_for is None or search_for.lower() in key.lower(): value = config_value_to_string(self._config._lookup(key)) safe_print(key, '=', value) def set(self, key=None, value=None): if value is None: self._print_config(key) return try: current_value = self._config._lookup(key) current_type = type(current_value) except KeyError: self._error(_('This configuration option does not exist.')) return if current_type == dict: self._error(_('Can only set leaf configuration nodes.')) return self._config.update_field(key, value) self.set(key) @FirstArgumentIsPodcastURL def rename(self, url, title): podcast = self.get_podcast(url) if podcast is not None: old_title = podcast.title podcast.rename(title) self._db.commit() self._info(_('Renamed %(old_title)s to %(new_title)s.') % { 'old_title': util.convert_bytes(old_title), 'new_title': util.convert_bytes(title), }) return True @FirstArgumentIsPodcastURL def unsubscribe(self, url): podcast = self.get_podcast(url) if podcast is None: self._error(_('You are not subscribed to %s.') % url) else: podcast.delete() self._db.commit() self._error(_('Unsubscribed from %s.') % url) return True def is_episode_new(self, episode): return (episode.state == gpodder.STATE_NORMAL and episode.is_new) def _episodesList(self, podcast): def status_str(episode): # is new if self.is_episode_new(episode): return u' * ' # is downloaded if (episode.state == gpodder.STATE_DOWNLOADED): return u' ▉ ' # is deleted if (episode.state == gpodder.STATE_DELETED): return u' ░ ' return u' ' episodes = (u'%3d. %s %s' % (i+1, status_str(e), e.title) for i, e in enumerate(podcast.get_all_episodes())) return episodes @FirstArgumentIsPodcastURL def info(self, url): podcast = self.get_podcast(url) if podcast is None: self._error(_('You are not subscribed to %s.') % url) else: def feed_update_status_msg(podcast): if podcast.pause_subscription: return "disabled" return "enabled" title, url, status = podcast.title, podcast.url, \ feed_update_status_msg(podcast) episodes = self._episodesList(podcast) episodes = u'\n '.join(episodes) self._pager(u""" Title: %(title)s URL: %(url)s Feed update is %(status)s Episodes: %(episodes)s """ % locals()) return True @FirstArgumentIsPodcastURL def episodes(self, url=None): output = [] for podcast in self._model.get_podcasts(): podcast_printed = False if url is None or podcast.url == url: episodes = self._episodesList(podcast) episodes = u'\n '.join(episodes) output.append(u""" Episodes from %s: %s """ % (podcast.url, episodes)) self._pager(u'\n'.join(output)) return True def list(self): for podcast in self._model.get_podcasts(): if not podcast.pause_subscription: safe_print('#', ingreen(podcast.title)) else: safe_print('#', inred(podcast.title), '-', _('Updates disabled')) safe_print(podcast.url) return True def _update_podcast(self, podcast): self._start_action(' %s', podcast.title) try: podcast.update() self._finish_action() except Exception, e: self._finish_action(False) def _pending_message(self, count): return N_('%(count)d new episode', '%(count)d new episodes', count) % {'count': count} @FirstArgumentIsPodcastURL def update(self, url=None): count = 0 safe_print(_('Checking for new episodes')) for podcast in self._model.get_podcasts(): if url is not None and podcast.url != url: continue if not podcast.pause_subscription: self._update_podcast(podcast) count += sum(1 for e in podcast.get_all_episodes() if self.is_episode_new(e)) else: self._start_action(_('Skipping %(podcast)s') % { 'podcast': podcast.title}) self._finish_action(skip=True) safe_print(inblue(self._pending_message(count))) return True @FirstArgumentIsPodcastURL def pending(self, url=None): count = 0 for podcast in self._model.get_podcasts(): podcast_printed = False if url is None or podcast.url == url: for episode in podcast.get_all_episodes(): if self.is_episode_new(episode): if not podcast_printed: safe_print('#', ingreen(podcast.title)) podcast_printed = True safe_print(' ', episode.title) count += 1 safe_print(inblue(self._pending_message(count))) return True def _download_episode(self, episode): self._start_action('Downloading %s', episode.title) task = download.DownloadTask(episode, self._config) task.add_progress_callback(self._update_action) task.status = download.DownloadTask.QUEUED task.run() self._finish_action() @FirstArgumentIsPodcastURL def download(self, url=None): count = 0 for podcast in self._model.get_podcasts(): podcast_printed = False if url is None or podcast.url == url: for episode in podcast.get_all_episodes(): if self.is_episode_new(episode): if not podcast_printed: safe_print(inblue(podcast.title)) podcast_printed = True self._download_episode(episode) count += 1 safe_print(count, 'episodes downloaded.') return True @FirstArgumentIsPodcastURL def disable(self, url): podcast = self.get_podcast(url) if podcast is None: self._error(_('You are not subscribed to %s.') % url) else: if not podcast.pause_subscription: podcast.pause_subscription = True podcast.save() self._db.commit() self._error(_('Disabling feed update from %s.') % url) return True @FirstArgumentIsPodcastURL def enable(self, url): podcast = self.get_podcast(url) if podcast is None: self._error(_('You are not subscribed to %s.') % url) else: if podcast.pause_subscription: podcast.pause_subscription = False podcast.save() self._db.commit() self._error(_('Enabling feed update from %s.') % url) return True def youtube(self, url): fmt_ids = youtube.get_fmt_ids(self._config.youtube) yurl = youtube.get_real_download_url(url, fmt_ids) safe_print(yurl) return True def webui(self, public=None): from gpodder import webui if public == 'public': # Warn the user that the web UI is listening on all network # interfaces, which could lead to problems. # Only use this on a trusted, private network! self._warn(_('Listening on ALL network interfaces.')) webui.main(only_localhost=False, core=self.core) else: webui.main(core=self.core) def pipe(self): from gpodder import pipe pipe.main(core=self.core) def search(self, *terms): query = ' '.join(terms) if not query: return directory = my.Directory() results = directory.search(query) self._show_directory_results(results) def toplist(self): directory = my.Directory() results = directory.toplist() self._show_directory_results(results, True) def _show_directory_results(self, results, multiple=False): if not results: self._error(_('No podcasts found.')) return if not interactive_console or is_single_command: safe_print('\n'.join(url for title, url in results)) return def show_list(): self._pager('\n'.join(u'%3d: %s\n %s' % (index+1, title, url if title != url else '') for index, (title, url) in enumerate(results))) show_list() msg = _('Enter index to subscribe, ? for list') while True: index = raw_input(msg + ': ') if not index: return if index == '?': show_list() continue try: index = int(index) except ValueError: self._error(_('Invalid value.')) continue if not (1 <= index <= len(results)): self._error(_('Invalid value.')) continue title, url = results[index-1] self._info(_('Adding %s...') % title) self.subscribe(url) if not multiple: break @FirstArgumentIsPodcastURL def rewrite(self, old_url, new_url): podcast = self.get_podcast(old_url) if podcast is None: self._error(_('You are not subscribed to %s.') % old_url) else: result = podcast.rewrite_url(new_url) if result is None: self._error(_('Invalid URL: %s') % new_url) else: new_url = result self._error(_('Changed URL from %(old_url)s to %(new_url)s.') % { 'old_url': old_url, 'new_url': new_url, }) return True def help(self): safe_print(stylize(__doc__), file=sys.stderr, end='') return True # ------------------------------------------------------------------- def _pager(self, output): if have_ansi: # Need two additional rows for command prompt rows_needed = len(output.splitlines()) + 2 rows, cols = get_terminal_size() if rows_needed < rows: safe_print(output) else: pydoc.pager(util.sanitize_encoding(output)) else: safe_print(output) def _shell(self): safe_print(os.linesep.join(x.strip() for x in (""" gPodder %(__version__)s "%(__relname__)s" (%(__date__)s) - %(__url__)s %(__copyright__)s License: %(__license__)s Entering interactive shell. Type 'help' for help. Press Ctrl+D (EOF) or type 'quit' to quit. """ % gpodder.__dict__).splitlines())) if readline is not None: readline.parse_and_bind('tab: complete') readline.set_completer(self._tab_completion) readline.set_completer_delims(' ') while True: try: line = raw_input('gpo> ') except EOFError: safe_print('') break except KeyboardInterrupt: safe_print('') continue if self._prefixes.get(line, line) in self.EXIT_COMMANDS: break try: args = shlex.split(line) except ValueError, value_error: self._error(_('Syntax error: %(error)s') % {'error': value_error}) continue try: self._parse(args) except KeyboardInterrupt: self._error('Keyboard interrupt.') except EOFError: self._error('EOF.') self._atexit() def _error(self, *args): safe_print(inred(' '.join(args)), file=sys.stderr) # Warnings look like error messages for now _warn = _error def _info(self, *args): safe_print(*args) def _checkargs(self, func, command_line): args, varargs, keywords, defaults = inspect.getargspec(func) args.pop(0) # Remove "self" from args defaults = defaults or () minarg, maxarg = len(args)-len(defaults), len(args) if len(command_line) < minarg or (len(command_line) > maxarg and \ varargs is None): self._error('Wrong argument count for %s.' % func.__name__) return False return func(*command_line) def _tab_completion_podcast(self, text, count): """Tab completion for podcast URLs""" urls = [p.url for p in self._model.get_podcasts() if text in p.url] if count < len(urls): return urls[count] return None def _tab_completion(self, text, count): """Tab completion function for readline""" if readline is None: return None current_line = readline.get_line_buffer() if text == current_line: for name in self._valid_commands: if name.startswith(text): if count == 0: return name else: count -= 1 else: args = current_line.split() command = args.pop(0) command_function = getattr(self, command, None) if not command_function: return None if getattr(command_function, '_first_arg_is_podcast', False): if not args or (len(args) == 1 and not current_line.endswith(' ')): return self._tab_completion_podcast(text, count) return None def _parse_single(self, command_line): try: result = self._parse(command_line) except KeyboardInterrupt: self._error('Keyboard interrupt.') result = -1 self._atexit() return result def _parse(self, command_line): if not command_line: return False command = command_line.pop(0) # Resolve command aliases command = self._prefixes.get(command, command) if command in self._commands: func = self._commands[command] if inspect.ismethod(func): return self._checkargs(func, command_line) if command in self._expansions: safe_print(_('Ambiguous command. Did you mean..')) for cmd in self._expansions[command]: safe_print(' ', inblue(cmd)) else: self._error(_('The requested function is not available.')) return False def stylize(s): s = re.sub(r' .{27}', lambda m: inblue(m.group(0)), s) s = re.sub(r' - .*', lambda m: ingreen(m.group(0)), s) return s if __name__ == '__main__': logger = logging.getLogger(__name__) cli = gPodderCli() args = sys.argv[1:] if args: is_single_command = True cli._parse_single(args) elif interactive_console: cli._shell() else: safe_print(__doc__, end='') gpodder-3.5.2/bin/gpodder0000755000175000017500000001413112220076757014707 0ustar thpthp00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """ gPodder enables you to subscribe to media feeds (RSS, Atom, YouTube, Soundcloud, Vimeo and XSPF) and automatically download new content. This is the gPodder GUI. See gpo(1) for the command-line interface. """ import sys import os import os.path import platform import logging import gettext import subprocess logger = logging.getLogger(__name__) try: import dbus import dbus.glib have_dbus = True except ImportError: print >>sys.stderr, """ Warning: python-dbus not found. Disabling D-Bus support. """ have_dbus = False from optparse import OptionParser def main(): # Paths to important files gpodder_script = sys.argv[0] while os.path.islink(gpodder_script): gpodder_script = os.readlink(gpodder_script) gpodder_dir = os.path.join(os.path.dirname(gpodder_script), '..') prefix = os.path.abspath(os.path.normpath(gpodder_dir)) src_dir = os.path.join(prefix, 'src') locale_dir = os.path.join(prefix, 'share', 'locale') ui_folder = os.path.join(prefix, 'share', 'gpodder', 'ui') credits_file = os.path.join(prefix, 'share', 'gpodder', 'credits.txt') images_folder = os.path.join(prefix, 'share', 'gpodder', 'images') icon_file = os.path.join(prefix, 'share', 'icons', 'hicolor', 'scalable', 'apps', 'gpodder.svg') if os.path.exists(os.path.join(src_dir, 'gpodder', '__init__.py')): # Run gPodder from local source folder (not installed) sys.path.insert(0, src_dir) # on Mac OS X, read from the defaults database the locale of the user if platform.system() == 'Darwin' and 'LANG' not in os.environ: locale_cmd = ('defaults', 'read', 'NSGlobalDomain', 'AppleLocale') process = subprocess.Popen(locale_cmd, stdout=subprocess.PIPE) output, error_output = process.communicate() # the output is a string like 'fr_FR', and we need 'fr_FR.utf-8' user_locale = output.strip() + '.UTF-8' os.environ['LANG'] = user_locale print >>sys.stderr, 'Setting locale to', user_locale # Set up the path to translation files gettext.bindtextdomain('gpodder', locale_dir) import gpodder gpodder.prefix = prefix # Platform detection (i.e. MeeGo 1.2 Harmattan, etc..) gpodder.detect_platform() # Enable i18n for gPodder translations _ = gpodder.gettext # Set up paths to folder with GtkBuilder files and gpodder.svg gpodder.ui_folders.append(ui_folder) gpodder.credits_file = credits_file gpodder.images_folder = images_folder gpodder.icon_file = icon_file s_usage = 'usage: %%prog [options]\n\n%s' % ( __doc__.strip() ) s_version = '%%prog %s' % ( gpodder.__version__ ) parser = OptionParser( usage = s_usage, version = s_version) parser.add_option("-v", "--verbose", action="store_true", dest="verbose", default=False, help=_("print logging output on the console")) parser.add_option("-q", "--qml", action="store_true", dest="qml", default=False, help=_("use the QML-based MeeGo 1.2 Harmattan UI")) parser.add_option('-s', '--subscribe', dest='subscribe', metavar='URL', help=_('subscribe to the feed at URL')) # On Mac OS X, support the "psn" parameter for compatibility (bug 939) if gpodder.ui.osx: parser.add_option('-p', '--psn', dest='macpsn', metavar='PSN', help=_('Mac OS X application process number')) options, args = parser.parse_args(sys.argv) if options.qml or (gpodder.ui.harmattan or gpodder.ui.sailfish): gpodder.ui.qml = True else: gpodder.ui.gtk = True gpodder.ui.unity = (os.environ.get('DESKTOP_SESSION', 'unknown').lower() in ('ubuntu', 'ubuntu-2d')) from gpodder import log log.setup(options.verbose) if have_dbus: # Try to find an already-running instance of gPodder session_bus = dbus.SessionBus() # Obtain a reference to an existing instance; don't call get_object if # such an instance doesn't exist as it *will* create a new instance if session_bus.name_has_owner(gpodder.dbus_bus_name): try: remote_object = session_bus.get_object(gpodder.dbus_bus_name, gpodder.dbus_gui_object_path) # An instance of GUI is already running logger.info('Activating existing instance via D-Bus.') remote_object.show_gui_window( dbus_interface=gpodder.dbus_interface) if options.subscribe: remote_object.subscribe_to_url(options.subscribe) return except dbus.exceptions.DBusException, dbus_exception: logger.info('Cannot connect to remote object.', exc_info=True) if not gpodder.ui.win32 and os.environ.get('DISPLAY', '') == '': logger.error('Cannot start gPodder: $DISPLAY is not set.') sys.exit(1) if gpodder.ui.qml: from gpodder import qmlui gpodder.ui_folders.insert(0, os.path.join(ui_folder, 'qml')) sys.exit(qmlui.main(args)) elif gpodder.ui.gtk: from gpodder.gtkui import main gpodder.ui_folders.insert(0, os.path.join(ui_folder, 'gtk')) main.main(options) else: logger.error('No GUI selected.') if __name__ == '__main__': main() gpodder-3.5.2/bin/gpodder-migrate2tres0000755000175000017500000000752412220076757017325 0ustar thpthp00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder-migrate2tres - Migrate data from gPodder 2.x to gPodder 3 # by Thomas Perl ; 2011-04-28 import sys import os import re import ConfigParser import shutil gpodder_script = sys.argv[0] if os.path.islink(gpodder_script): gpodder_script = os.readlink(gpodder_script) gpodder_dir = os.path.join(os.path.dirname(gpodder_script), '..') prefix = os.path.abspath(os.path.normpath(gpodder_dir)) src_dir = os.path.join(prefix, 'src') if os.path.exists(os.path.join(src_dir, 'gpodder', '__init__.py')): # Run gPodder from local source folder (not installed) sys.path.insert(0, src_dir) import gpodder gpodder.prefix = prefix # Platform detection (i.e. MeeGo 1.2 Harmattan, etc..) gpodder.detect_platform() from gpodder import schema from gpodder import util old_database = os.path.expanduser('~/.config/gpodder/database.sqlite') new_database = gpodder.database_file old_config = os.path.expanduser('~/.config/gpodder/gpodder.conf') new_config = gpodder.config_file if not os.path.exists(old_database): print >>sys.stderr, """ Turns out that you never ran gPodder 2. Can't find this required file: %(old_database)s """ % locals() sys.exit(1) old_downloads = None if os.path.exists(old_config): parser = ConfigParser.RawConfigParser() parser.read(old_config) try: old_downloads = parser.get('gpodder-conf-1', 'download_dir') except ConfigParser.NoSectionError: # The file is empty / section (gpodder-conf-1) not found pass except ConfigParser.NoOptionError: # The section is available, but the key (download_dir) is not pass if old_downloads is None: # The user has no configuration. This usually happens when # only the CLI version of gPodder is used. In this case, the # download directory is most likely the default (bug 1434) old_downloads = os.path.expanduser('~/gpodder-downloads') new_downloads = gpodder.downloads if not os.path.exists(old_downloads): print >>sys.stderr, """ Old download directory does not exist. Creating empty one. """ os.makedirs(old_downloads) if any(os.path.exists(x) for x in (new_database, new_downloads)): print >>sys.stderr, """ Existing gPodder 3 user data found. To continue, please remove: %(new_database)s %(new_downloads)s """ % locals() sys.exit(1) print >>sys.stderr, """ Would carry out the following actions: Move downloads from %(old_downloads)s to %(new_downloads)s Convert database from %(old_database)s to %(new_database)s """ % locals() result = raw_input('Continue? (Y/n) ') if result in 'Yy': util.make_directory(gpodder.home) schema.convert_gpodder2_db(old_database, new_database) if not os.path.exists(new_database): print >>sys.stderr, 'Could not convert database.' sys.exit(1) shutil.move(old_downloads, new_downloads) if not os.path.exists(new_downloads): print >>sys.stderr, 'Could not move downloads.' sys.exit(1) print 'Done. Have fun with gPodder 3!' gpodder-3.5.2/po/0000755000175000017500000000000012220346122013165 5ustar thpthp00000000000000gpodder-3.5.2/po/ca.po0000644000175000017500000015162412220345607014130 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/gpodder/language/" "ca/)\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "" #: src/gpodder/model.py:679 msgid "unknown" msgstr "" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 msgid "Episode added to playlist" msgstr "" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" gpodder-3.5.2/po/cs.po0000644000175000017500000020011012220345607014133 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Czech (http://www.transifex.com/projects/p/gpodder/language/" "cs/)\n" "Language: cs\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" #: src/gpodder/config.py:55 #, fuzzy, python-format msgid "gPodder on %s" msgstr "gPodder nalezl %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "Dnes" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Včera" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(neznámý)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Zrušeno uživatelem" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Zápis dat na disk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Otevírání databáze iPodu" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPodu připojen" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Ukládám databázi iPodu" #: src/gpodder/sync.py:313 #, fuzzy msgid "Writing extended gtkpod database" msgstr "Zápis dat na disk" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Odstraňuji %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Přidávání %s" #: src/gpodder/sync.py:420 #, fuzzy, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "Chyba kopírování %s: Nedostatek volného místa na %s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Připojování MP3 přehrávače" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 přehrávač připojen" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, fuzzy, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 #, fuzzy msgid "MTP device" msgstr "Výběr zařízení" #: src/gpodder/sync.py:762 #, fuzzy msgid "Opening the MTP device" msgstr "Kopírování souborů na zařízení" #: src/gpodder/sync.py:772 #, fuzzy, python-format msgid "%s opened" msgstr "iPodu připojen" #: src/gpodder/sync.py:777 #, fuzzy, python-format msgid "Closing %s" msgstr "Odstraňuji %s" #: src/gpodder/sync.py:785 #, fuzzy, python-format msgid "%s closed" msgstr "%s je uzamčeno" #: src/gpodder/sync.py:790 bin/gpo:658 #, fuzzy, python-format msgid "Adding %s..." msgstr "Přidávání %s" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 #, fuzzy msgid "Added" msgstr "Pokročilé" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Zařazeno do fronty" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synchronizace" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #, fuzzy msgid "Failed" msgstr "Filtr:" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #, fuzzy msgid "Cancelled" msgstr "Zrušit" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, fuzzy, python-format msgid "Error: %s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/my.py:176 #, fuzzy, python-format msgid "Add %s" msgstr "Přidávání %s" #: src/gpodder/my.py:178 #, fuzzy, python-format msgid "Remove %s" msgstr "Odstranit %s?" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Popis" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Popis není dostupný" #: src/gpodder/model.py:679 #, fuzzy msgid "unknown" msgstr "(neznámý)" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 #, fuzzy msgid "Downloading" msgstr "stahování" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, fuzzy, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/download.py:866 #, fuzzy, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Celé číslo" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "_Zrušit stahování" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Popis není dostupný" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, fuzzy, python-format msgid "Command: %s" msgstr "Příkazový řádek:" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 #, fuzzy msgid "gPodder" msgstr "Ukončit gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 #, fuzzy msgid "Loading incomplete downloads" msgstr "Označit %s jako nestažené" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:308 #, fuzzy msgid "Resume all" msgstr "stažené soubory" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "" #: src/gpodder/gtkui/main.py:465 #, fuzzy msgid "Confirm changes from gpodder.net" msgstr "Stáhnout do:" #: src/gpodder/gtkui/main.py:466 #, fuzzy msgid "Select the actions you want to carry out." msgstr "Označte epizody ke stažení." #: src/gpodder/gtkui/main.py:506 #, fuzzy msgid "Uploading subscriptions" msgstr "Popis" #: src/gpodder/gtkui/main.py:507 #, fuzzy msgid "Your subscriptions are being uploaded to the server." msgstr "Popis" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 #, fuzzy msgid "Error while uploading" msgstr "Chyba aktualizace %s" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Epizoda" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Velikost" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Vyšlo" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Průběh" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 #, fuzzy msgid "Loading episodes" msgstr "Stahuji epizody" #: src/gpodder/gtkui/main.py:994 #, fuzzy msgid "No episodes in current view" msgstr "Není vybrán žádný kanál" #: src/gpodder/gtkui/main.py:996 #, fuzzy msgid "No episodes available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:1002 #, fuzzy msgid "No podcasts in this view" msgstr "Není vybrán žádný kanál" #: src/gpodder/gtkui/main.py:1004 #, fuzzy msgid "No subscriptions" msgstr "Popis" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "stažené soubory" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Není možné přidat kanál" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 #, fuzzy msgid "Downloads finished" msgstr "gPodder dokončil stahování" #: src/gpodder/gtkui/main.py:1388 #, fuzzy msgid "Downloads failed" msgstr "Staženo" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Není možné přidat kanál" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Synchronizace dokončena." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Po synchronizaci:" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 #, fuzzy msgid "Episode details" msgstr "Epizoda" #: src/gpodder/gtkui/main.py:1527 #, fuzzy msgid "Start download now" msgstr "Limit rychlosti stahování na" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Stáhnout" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Zrušit" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 #, fuzzy msgid "Pause" msgstr "Hodnota" #: src/gpodder/gtkui/main.py:1533 #, fuzzy msgid "Remove from list" msgstr "Odstranit staré episody" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 #, fuzzy msgid "Update podcast" msgstr "%d označených epizod" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Otevřít adresář pro stahování" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Označit epizody jako přehrané" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 #, fuzzy msgid "Remove podcast" msgstr "_Připojit se k novému kanálu" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 #, fuzzy msgid "Podcast settings" msgstr "Podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Chyba při konverzi souboru" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "přenos souborů přes Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 #, fuzzy msgid "Bluetooth device" msgstr "zařízení bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 #, fuzzy msgid "Please check your media player settings in the preferences dialog." msgstr "" "Vybraný přehrávač nebyl nalezen. Zkontrolujte prosím zvolený přehrávač v " "nastavení programu." #: src/gpodder/gtkui/main.py:1970 #, fuzzy msgid "Error opening player" msgstr "Chyba spouštění přehrávače: %s" #: src/gpodder/gtkui/main.py:2211 #, fuzzy msgid "Adding podcasts" msgstr "Vynechávám kanál: %s" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 #, fuzzy msgid "Existing subscriptions skipped" msgstr "Popis" #: src/gpodder/gtkui/main.py:2220 #, fuzzy msgid "You are already subscribed to these podcasts:" msgstr "K tomuto kanálu jste již přihlášený: %s" #: src/gpodder/gtkui/main.py:2228 #, fuzzy msgid "Podcast requires authentication" msgstr "Přihlášení heslem" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 #, fuzzy msgid "Do you want to visit the website now?" msgstr "Skutečně chcete ukončit gPodder?" #: src/gpodder/gtkui/main.py:2254 #, fuzzy msgid "Could not add some podcasts" msgstr "Není možné přidat kanál" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 #, fuzzy msgid "Unknown" msgstr "(neznámý)" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 #, fuzzy msgid "Merging episode actions" msgstr "Vybrat epizody" #: src/gpodder/gtkui/main.py:2376 #, fuzzy msgid "Episode actions from gpodder.net are merged." msgstr "Stáhnout do:" #: src/gpodder/gtkui/main.py:2401 #, fuzzy msgid "Cancelling..." msgstr "Zrušit" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Uživatelské jméno:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2450 #, fuzzy, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 #, fuzzy msgid "Error while updating feed" msgstr "Chyba aktualizace %s" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Žádné nové epizody" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Ukončit gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Epizody jsou uzamčeny" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Označené epizody jsou uzamčené. Pro jejich smazání je potřeba je nejprve " "odemčít." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2595 #, fuzzy msgid "Deleting episodes removes downloaded files." msgstr "Označit epizody k odstranění z iPodu" #: src/gpodder/gtkui/main.py:2600 #, fuzzy msgid "Deleting episodes" msgstr "Vybrat epizody" #: src/gpodder/gtkui/main.py:2601 #, fuzzy msgid "Please wait while episodes are deleted" msgstr "Označte epizody ke stažení." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Označit přehrané" #: src/gpodder/gtkui/main.py:2656 #, fuzzy msgid "Select finished" msgstr "Zrušit výběr" #: src/gpodder/gtkui/main.py:2660 #, fuzzy msgid "Select the episodes you want to delete:" msgstr "Označte epizody ke stažení." #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 #, fuzzy msgid "Delete episodes" msgstr "Smazat označené epizody" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 #, fuzzy msgid "No podcast selected" msgstr "Není vybrán žádný kanál" #: src/gpodder/gtkui/main.py:2742 #, fuzzy msgid "Please select a podcast in the podcasts list to update." msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 #, fuzzy msgid "Download error" msgstr "Stáhnout do:" #: src/gpodder/gtkui/main.py:2850 #, fuzzy msgid "Select the episodes you want to download:" msgstr "Označte epizody ke stažení." #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 #, fuzzy msgid "Mark as old" msgstr "Označit %s jako už přehrané" #: src/gpodder/gtkui/main.py:2881 #, fuzzy msgid "Please check for new episodes later." msgstr "Zkontrolovat zda nevyšly nové epizody" #: src/gpodder/gtkui/main.py:2882 #, fuzzy msgid "No new episodes available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:2937 #, fuzzy msgid "Login to gpodder.net" msgstr "Stáhnout do:" #: src/gpodder/gtkui/main.py:2938 #, fuzzy msgid "Please login to download your subscriptions." msgstr "Popis" #: src/gpodder/gtkui/main.py:2953 #, fuzzy msgid "Subscriptions on gpodder.net" msgstr "Popis" #: src/gpodder/gtkui/main.py:2972 #, fuzzy msgid "Please select a podcast in the podcasts list to edit." msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 #, fuzzy msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 #, fuzzy msgid "Remove podcasts" msgstr "_Připojit se k novému kanálu" #: src/gpodder/gtkui/main.py:2994 #, fuzzy msgid "Select the podcast you want to remove." msgstr "Označte epizody ke stažení." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 #, fuzzy msgid "Remove" msgstr "Odstranit %s" #: src/gpodder/gtkui/main.py:3007 #, fuzzy msgid "Removing podcast" msgstr "Odstraňuji %s" #: src/gpodder/gtkui/main.py:3008 #, fuzzy msgid "Please wait while the podcast is removed" msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:3009 #, fuzzy msgid "Do you really want to remove this podcast and its episodes?" msgstr "Skutečně chcete odstranit %s i všechny dosud stažené epizody?" #: src/gpodder/gtkui/main.py:3011 #, fuzzy msgid "Removing podcasts" msgstr "Vynechávám kanál: %s" #: src/gpodder/gtkui/main.py:3012 #, fuzzy msgid "Please wait while the podcasts are removed" msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:3013 #, fuzzy msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Skutečně chcete odstranit %s i všechny dosud stažené epizody?" #: src/gpodder/gtkui/main.py:3073 #, fuzzy msgid "Please select a podcast in the podcasts list to remove." msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:3083 #, fuzzy msgid "OPML files" msgstr "Export OPML skončil neúspěšně" #: src/gpodder/gtkui/main.py:3088 #, fuzzy msgid "Import from OPML" msgstr "Export do OPML" #: src/gpodder/gtkui/main.py:3102 #, fuzzy msgid "Import podcasts from OPML file" msgstr "Odstranit podcasty z iPodu" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Není co exportovat" #: src/gpodder/gtkui/main.py:3110 #, fuzzy msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Váš seznam přihlášených kanálů je prázdný. Přihlaste se prosím k nějakému " "zdroji podcastu abyste mohli svůj seznam exportovat." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Export do OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Není možné exportovat OPML do souboru. Zkontrolujte prosím svá přístupová " "práva." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Export OPML skončil neúspěšně" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Odstraňuji %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "Vyšlo" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Stáhnout do:" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Ukončit gPodder" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Seznam přání na Amazon" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Ondřej Veselý xorwen@gmail.com" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 #, fuzzy msgid "Please select an episode from the episode list to display shownotes." msgstr "Vyberte si prosím ze seznamu kanál k úpravám." #: src/gpodder/gtkui/main.py:3320 #, fuzzy msgid "No episode selected" msgstr "Není nic vybráno" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, fuzzy, python-format msgid "D-Bus error: %s" msgstr "Chyba otevírání %s: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, fuzzy, python-format msgid "from %s" msgstr "z %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Celé číslo" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Desetinné číslo" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Pravdivostní hodnota" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Textový řetězec" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, fuzzy, python-format msgid "released %s" msgstr "Vyšlo" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 #, fuzzy msgid "played" msgstr "Nepřehrané" #: src/gpodder/gtkui/model.py:83 #, fuzzy msgid "unplayed" msgstr "Nepřehrané" #: src/gpodder/gtkui/model.py:86 #, fuzzy msgid "today" msgstr "Dnes" #: src/gpodder/gtkui/model.py:87 #, fuzzy, python-format msgid "downloaded %s" msgstr "Stáhnout %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 #, fuzzy msgid "Deleted" msgstr "Vyšlo" #: src/gpodder/gtkui/model.py:343 #, fuzzy msgid "New episode" msgstr "Žádné nové epizody" #: src/gpodder/gtkui/model.py:357 #, fuzzy msgid "Downloaded episode" msgstr "Stáhnout nové epizody" #: src/gpodder/gtkui/model.py:360 #, fuzzy msgid "Downloaded video episode" msgstr "Stáhnout nové epizody" #: src/gpodder/gtkui/model.py:363 #, fuzzy msgid "Downloaded image" msgstr "Staženo" #: src/gpodder/gtkui/model.py:366 #, fuzzy msgid "Downloaded file" msgstr "Staženo" #: src/gpodder/gtkui/model.py:381 #, fuzzy msgid "missing file" msgstr "Odstraňuji soubory" #: src/gpodder/gtkui/model.py:385 #, fuzzy msgid "never displayed" msgstr "Označit přehrané" #: src/gpodder/gtkui/model.py:387 #, fuzzy msgid "never played" msgstr "Označit přehrané" #: src/gpodder/gtkui/model.py:389 #, fuzzy msgid "never opened" msgstr "Označit přehrané" #: src/gpodder/gtkui/model.py:392 #, fuzzy msgid "displayed" msgstr "Nepřehrané" #: src/gpodder/gtkui/model.py:396 #, fuzzy msgid "opened" msgstr "iPodu připojen" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 #, fuzzy msgid "All episodes" msgstr "Smazat epizody" #: src/gpodder/gtkui/model.py:434 #, fuzzy msgid "from all podcasts" msgstr "_Podcasty" #: src/gpodder/gtkui/model.py:626 #, fuzzy msgid "Subscription paused" msgstr "Popis" #: src/gpodder/gtkui/interface/addpodcast.py:74 #, fuzzy msgid "Nothing to paste." msgstr "Není co exportovat" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 #, fuzzy msgid "Username" msgstr "Uživatelské jméno:" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 #, fuzzy msgid "Password" msgstr "Heslo:" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Výběr umístění" #: src/gpodder/gtkui/interface/configeditor.py:34 #, fuzzy msgid "Setting" msgstr "Textový řetězec" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, fuzzy, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Není možné nastavit hodnotu od %s do %s.\n" "\n" "Požadovaný datový typ: %s" #: src/gpodder/gtkui/interface/configeditor.py:85 #, fuzzy msgid "Error setting option" msgstr "Chyba ukládání seznamu kanálů" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nic nedělat" #: src/gpodder/gtkui/desktop/preferences.py:51 #, fuzzy msgid "Show episode list" msgstr "Epizoda" #: src/gpodder/gtkui/desktop/preferences.py:52 #, fuzzy msgid "Add to download list" msgstr "odkaz ke stažení" #: src/gpodder/gtkui/desktop/preferences.py:53 #, fuzzy msgid "Download immediately" msgstr "Staženo" #: src/gpodder/gtkui/desktop/preferences.py:71 #, fuzzy msgid "None" msgstr "iPodu připojen" #: src/gpodder/gtkui/desktop/preferences.py:72 #, fuzzy msgid "Filesystem-based" msgstr "" "Žádný\n" "iPod\n" "Souborový MP3 přehrávač" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Označit %s jako dosud nepřehrávané" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Smazat epizody z počítače" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Chyba otevírání %s: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Vlastní formát řetězců" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 #, fuzzy msgid "Configure audio player" msgstr "Editor kanálů" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 #, fuzzy msgid "Command:" msgstr "Příkazový řádek:" #: src/gpodder/gtkui/desktop/preferences.py:494 #, fuzzy msgid "Configure video player" msgstr "MP3 přehrávač" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 #, fuzzy msgid "manually" msgstr "Uživatelské jméno:" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/desktop/preferences.py:556 #, fuzzy msgid "Replace subscription list on server" msgstr "Popis" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 #, fuzzy msgid "Select folder for mount point" msgstr "Volba přípojeného bodu pro iPod" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Volba přípojeného bodu pro iPod" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Na zadané URL adrese se nenachází žádný platní OPML podcast." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nebyly nalezeny zdroje podcastu" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 #, fuzzy msgid "No channels found" msgstr "Nebyly nalezeny zdroje podcastu" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Označit vše" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Zrušit výběr" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Není nic vybráno" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, fuzzy, python-format msgid "size: %s" msgstr "Celková velikost: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Chyba spouštění přehrávače: %s" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Seznam kaná_lů" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Uživatelské jméno:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Sem patří pouze jediný obrázek nebo URL adresa." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Táhni a pusť" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Sem můžete přetáhnout pouze místní soubory a http:// adresy." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Není nastavené žádné zařízení" #: src/gpodder/gtkui/desktop/sync.py:87 #, fuzzy msgid "Please set up your device in the preferences dialog." msgstr "" "Vybraný přehrávač nebyl nalezen. Zkontrolujte prosím zvolený přehrávač v " "nastavení programu." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Není možné připojit zařízení" #: src/gpodder/gtkui/desktop/sync.py:92 #, fuzzy msgid "Please check the settings in the preferences dialog." msgstr "" "Vybraný přehrávač nebyl nalezen. Zkontrolujte prosím zvolený přehrávač v " "nastavení programu." #: src/gpodder/gtkui/desktop/sync.py:139 #, fuzzy msgid "Not enough space left on device" msgstr "Žádné soubory na zařízení" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Chyba při konverzi souboru" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Smazat epizody" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Staženo" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Smazat epizody" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Označit %s jako dosud nepřehrávané" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "_Zrušit stahování" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Vybrat epizody" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Není možné odstranit kanál" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 #, fuzzy msgid "Delete" msgstr "Vyšlo" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Popis" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Chyba aktualizace %s" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Stahuji zdroje podcastu" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Stahuji zdroje podcastu" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 #, fuzzy msgid "Rename" msgstr "Uživatelské jméno:" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Seznam kaná_lů" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 #, fuzzy msgid "Unsubscribe" msgstr "Popis" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Vybrat epizody" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Vybrat epizody" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Odstranit kanál včetně epizod?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Uživatelské jméno:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Uživatelské jméno:" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Smazat označené epizody" #: src/gpodder/qmlui/__init__.py:753 #, fuzzy msgid "Mark as new" msgstr "Označit %s jako dosud nepřehrávané" #: src/gpodder/qmlui/__init__.py:756 #, fuzzy msgid "Allow deletion" msgstr "Smazat všechny epizody" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "MP3 přehrávač" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Vynechávám kanál: %s" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Není možné přidat kanál" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "stažené soubory" #: src/gpodder/plugins/soundcloud.py:153 #, fuzzy msgid "Unknown track" msgstr "(neznámý)" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "Použít převaděč:" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "jedna stažená epizoda:" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Jsou dostupné nové epizody" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Konverze souboru" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Konverze souboru" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Odstranit staré episody" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "_Připojit se k novému kanálu" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Zkontrolovat zda nevyšly nové epizody" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Zkontrolovat zda nevyšly nové epizody" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Stav" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Konverze souboru" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Epizoda" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 #, fuzzy msgid "Add a new podcast" msgstr "_Připojit se k novému kanálu" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 #, fuzzy msgid "URL:" msgstr "URL zdroje podcast:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 #, fuzzy msgid "gPodder Podcast Editor" msgstr "Editor kanálů" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synchronizuji iPod/přehrávač" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Obecné" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP autentizace" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Uživatelské jméno:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Heslo:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Místa" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Stáhnout do:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Webová stránka:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "nálepka webu" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Pokročilé" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor kanálů" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Označit vše" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Zkontrolovat zda nevyšly nové epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Stáhnout nové epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 #, fuzzy msgid "Preferences" msgstr "_Volby" #: share/gpodder/ui/gtk/gpodder.ui.h:7 #, fuzzy msgid "_Subscriptions" msgstr "Popis" #: share/gpodder/ui/gtk/gpodder.ui.h:8 #, fuzzy msgid "Discover new podcasts" msgstr "_Připojit se k novému kanálu" #: share/gpodder/ui/gtk/gpodder.ui.h:9 #, fuzzy msgid "Add podcast via URL" msgstr "Vynechávám kanál: %s" #: share/gpodder/ui/gtk/gpodder.ui.h:14 #, fuzzy msgid "Import from OPML file" msgstr "Export do OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 #, fuzzy msgid "Export to OPML file" msgstr "Export do OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 #, fuzzy msgid "Go to gpodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/gtk/gpodder.ui.h:17 #, fuzzy msgid "_Episodes" msgstr "Epizoda" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 #, fuzzy msgid "Play" msgstr "Přehrávač" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 #, fuzzy msgid "Change delete lock" msgstr "Seznam kaná_lů" #: share/gpodder/ui/gtk/gpodder.ui.h:26 #, fuzzy msgid "E_xtras" msgstr "Ostatní" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "_Synchronizace" #: share/gpodder/ui/gtk/gpodder.ui.h:28 #, fuzzy msgid "_View" msgstr "_Zobrazení" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Epizoda" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Chyba ukládání seznamu kanálů" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Zobrazovat panel nástrojů" #: share/gpodder/ui/gtk/gpodder.ui.h:32 #, fuzzy msgid "Episode descriptions" msgstr "Zobrazovat popis epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:34 #, fuzzy msgid "Hide deleted episodes" msgstr "Smazat epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:35 #, fuzzy msgid "Downloaded episodes" msgstr "Stáhnout nové epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:36 #, fuzzy msgid "Unplayed episodes" msgstr "Stahuji epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:37 #, fuzzy msgid "Hide podcasts without episodes" msgstr "Odstranit kanál včetně epizod?" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Nápověda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 #, fuzzy msgid "User manual" msgstr "Uživatelské jméno:" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 #, fuzzy msgid "Filter:" msgstr "Filtr:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:43 #, fuzzy msgid "Limit rate to" msgstr "Limit rychlosti stahování na" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 #, fuzzy msgid "Limit downloads to" msgstr "Limit rychlosti stahování na" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Vybrat epizody" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Textový řetězec" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Označte epizody" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Chyba ukládání seznamu kanálů" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 #, fuzzy msgid "Choose from a list of example podcasts" msgstr "_Podcasty" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Vynechávám kanál: %s" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 #, fuzzy msgid "Audio player:" msgstr "MP3 přehrávač" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 #, fuzzy msgid "Video player:" msgstr "MP3 přehrávač" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Stahuji epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 #, fuzzy msgid "Device name:" msgstr "Zařízení" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 #, fuzzy msgid "gpodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 #, fuzzy msgid "Update interval:" msgstr "Stahuji zdroje podcastu" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 #, fuzzy msgid "When new episodes are found:" msgstr "Jsou dostupné nové epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 #, fuzzy msgid "Updating" msgstr "Přidávání %s" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 #, fuzzy msgid "Delete played episodes:" msgstr "Odstranit staré episody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Odstranit podcasty z iPodu" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 #, fuzzy msgid "Also remove unplayed episodes" msgstr "Odstranit staré episody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 #, fuzzy msgid "Clean-up" msgstr "Vyčištění" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 #, fuzzy msgid "Device type:" msgstr "Zařízení" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 #, fuzzy msgid "Mountpoint:" msgstr "adresář iPodu:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 #, fuzzy msgid "After syncing an episode:" msgstr "stahování %d epizod" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Popis" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Název playlistu:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 #, fuzzy msgid "Only sync unplayed episodes" msgstr "Stahuji epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 #, fuzzy msgid "Devices" msgstr "Zařízení" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 #, fuzzy msgid "Find new podcasts" msgstr "_Připojit se k novému kanálu" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 #, fuzzy msgid "Select All" msgstr "Označit vše" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 #, fuzzy msgid "Select None" msgstr "Zrušit výběr" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 #, fuzzy msgid "Top _podcasts" msgstr "_Podcasty" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 #, fuzzy msgid "_YouTube" msgstr "_Odstranit kanál" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Vynechávám kanál: %s" #: share/gpodder/ui/qml/main_default.qml:41 #, fuzzy msgid "Settings" msgstr "Textový řetězec" #: share/gpodder/ui/qml/main_default.qml:143 #, fuzzy msgid "About" msgstr "Přerušeno" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "Stáhnout do:" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Zařízení" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "Podcast" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "%d stažených epizod:" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Není vybrán žádný kanál" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Po synchronizaci:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Popis" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Nepřehrané" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Název playlistu:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Epizoda" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Stáhnout nové epizody" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Vybrat epizody" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 #, fuzzy msgid "Shownotes" msgstr "%d stažených epizod:" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Vybrat adresář pro stahování" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Seznam kaná_lů" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "_Podcasty" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Žádné nové epizody" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Epizoda" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "_Připojit se k novému kanálu" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Stáhnout do:" #: share/gpodder/ui/qml/Subscribe.qml:153 #, fuzzy msgid "Subscribe" msgstr "Popis" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "Vyšlo" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Vyšlo" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Přihlášení heslem" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "K tomuto kanálu jste již přihlášený: %s" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Není možné odpojit zařízení." #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Není možné odpojit zařízení." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Popis" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "%d označených epizod" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Zkontrolovat zda nevyšly nové epizody" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Vynechávám kanál: %s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Odstraňuji soubory" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Nebyly nalezeny zdroje podcastu" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Vypisovat ladící informace na standardní výstup" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Přihlásit se k odběru z URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "Editor kanálů" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Podcast" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Použít převaděč:" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konverze souboru" #, fuzzy #~ msgid "Please wait..." #~ msgstr "Stahuji, prosím počkejte..." gpodder-3.5.2/po/cs_CZ.po0000644000175000017500000021302512220345607014540 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # David Štancl , 2012. # , 2012. # , 2012. # Petr Šimáček , 2013. # Vít Stanislav , 2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/" "gpodder/language/cs_CZ/)\n" "Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder na %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Před %(count)d dnem" msgstr[1] "Před %(count)d dny" msgstr[2] "Před %(count)d dny" #: src/gpodder/util.py:495 msgid "Today" msgstr "Dnes" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Včera" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(neznámo)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekunda" msgstr[1] "%(count)d sekundy" msgstr[2] "%(count)d sekund" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hodina" msgstr[1] "%(count)d hodiny" msgstr[2] "%(count)d hodin" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuta" msgstr[1] "%(count)d minuty" msgstr[2] "%(count)d minut" #: src/gpodder/util.py:1245 msgid "and" msgstr "a" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Zrušeno uživatelem" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Zapisování dat na disk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Otevření databáze iPodu" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod otevřen" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Ukládání databáze iPodu" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Zapisování rozšířené gtkpod databáze" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Odstranění %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Přidání %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "Chyba při kopírování %(episode)s: Není dostatek místa v %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Otevírání MP3 přehrávače" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 přehrávač otevřen" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Chyba při otevírání %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP zařízení" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Otevření MTP zařízení" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s otevřen" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Zavírání %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s zavřen" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Přidávání %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Přidáno" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Zařazeno do fronty" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Synchronizace" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Dokončeno" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Selhalo" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Zrušeno" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pozastaveno" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Chyba: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Přidat %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Odebrat %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Nedostatek prostředků pro použití služby Flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Položka neexistuje ve službě Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Už bylo zaplaceno prostřednictvím Flattru nebo položku vlastníte" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Neplatný požadavek" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Nebylo nalezeno internetové připojení" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Bez popisu" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Popis není k dispozici" #: src/gpodder/model.py:679 msgid "unknown" msgstr "neznámý" #: src/gpodder/model.py:744 msgid "Default" msgstr "Výchozí" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Zachovat pouze poslední" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Jiný" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Špatné jméno/heslo" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Stahování" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Poznámky" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Chyba vstupu/výstupu: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Chyba HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Začlenění do pracovního prostředí" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Rozhraní" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Příspěvek ke stažení" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Pro tento doplněk není dostupný popis." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Příkaz %(command)s nebyl nalezen" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Python modul %(module)s nebyl nalezen" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Příkaz: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Výchozí aplikace" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Načítání nedokončených stahování" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Stahování některých epizod nebylo při minulém spuštění dokončeno." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d neúplný soubor" msgstr[1] "%(count)d neúplné soubory" msgstr[2] "%(count)d neúplných souborů" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Obnovit vše" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Byla nalezena nedokončená stahování z minulého spuštění." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Akce" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Potvrdit změny z gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Vyberte akci, kterou chcete provést" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Nahrávání odběrů" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Vaše odběry jsou nahrávány na server" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Seznam byl úspěšně nahrán" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Při nahrávání došlo k chybě" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Epizoda" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Velikost" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Délka" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Vydáno" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Viditelné sloupce" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Průběh" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Načítání epizod" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Žádné odběry v současném zobrazení" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Žádné dostupné epizody" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Žádné podcasty v tomto zobrazení" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Žádné odběry" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Žádné aktivní úlohy" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktivní" msgstr[1] "%(count)d aktivní" msgstr[2] "%(count)d aktivních" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d selhal" msgstr[1] "%(count)d selhaly" msgstr[2] "%(count)d selhalo" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d ve frontě" msgstr[1] "%(count)d ve frontě" msgstr[2] "%(count)d ve frontě" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "stahuje se %(count)d ve soubor" msgstr[1] "stahují se %(count)d ve soubory" msgstr[2] "stahuje se %(count)d ve souborů" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "synchronizace %(count)d souboru" msgstr[1] "synchronizace %(count)d souborů" msgstr[2] "synchronizace %(count)d souborů" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d úloha ve frontě" msgstr[1] "%(queued)d úlohy ve frontě" msgstr[2] "%(queued)d úloh ve frontě" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Nahlaste, prosím, tento problém a restartujte gPodder" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Nezvládnutá výjimka" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Chyba při zpracování zdroje: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Nelze stáhnout některé epizody:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Stahování dokončeno" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Stahování selhalo" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Nelze synchronizovat některé epizody:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Synchronizace se zařízením dokončena" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Synchronizace se zařízením se nezdařila" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d další epizoda" msgstr[1] "%(count)d další epizody" msgstr[2] "%(count)d dalších epizod" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detaily epizody" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Zahájit stahování" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Stahování" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Zrušeno" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pozastavit" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Odstranit ze seznamu" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Aktualizovat podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Otevřít složku pro stahování" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Označit epizody jako staré" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivovat" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Odstranit podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Nastavení podcastů" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Chyba při převádění souboru" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Přenos souboru přes bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Ukázka" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Proud" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Odeslat na" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Místní složka" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Zařízení bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nový" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Zaplatit toto přes Flattr" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Stav služby Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Zkontrolujte nastavení vašeho přehrávače v nabídce možnosti" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Chyba při otevírání přehrávače" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Přidávání podcastů" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Informace o epizodě se stahují, čekejte, prosím" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Stávající odběry přeskočeny" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Tyto podcasty již odebíráte:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast požaduje autentizaci" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Přihlaste se na %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autentizace selhala" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Bylo zaznamenáno přesměrování webové stránky" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL %(url)s se přesměrovává na %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Chcete nyní navštívit webovou stránku" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Některé podcasty nemohly být přidány" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Některé podcasty nemohly být přidány do vašeho seznamu:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Neznámý" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Bylo zaznamenáno přesměrování" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Sloučení akcí epizody" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Akce epizody z gpodder.net jsou sloučeny" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Zrušení..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Připojte prosím síť a zkuste to znovu" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Žádné připojení k síti" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Aktualizace %(count)d zdroje..." msgstr[1] "Aktualizace %(count)d zdrojů..." msgstr[2] "Aktualizace %(count)d zdrojů..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Chyba při aktualizaci %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Zdroj na %(url)s se nepodařilo aktualizovat." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Chyba při aktualizaci zdroje" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Aktualizován %(podcast)s (%(position)d z %(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Žádné nové epizody" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Stahování %(count)d nové epizody" msgstr[1] "Stahování %(count)d nových epizod" msgstr[2] "Stahování %(count)d nových epizod" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Jsou dostupné nové epizody" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nová epizoda přidána do seznamu stahovaní" msgstr[1] "%(count)d nové epizody přidány do seznamu stahovaní" msgstr[2] "%(count)d nových epizod přidáno do seznamu stahovaní" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nová dostupná epizoda" msgstr[1] "%(count)d nové dostupné epizody" msgstr[2] "%(count)d nových dostupných epizod" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Ukončit gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Stahujete epizody. Stahování můžete obnovit při příštím startu gPodderu. " "Chcete nyní skončit" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Epizody jsou uzamčeny" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Označené epizody jsou uzamčené. Pro jejich smazání je potřeba je nejprve " "odemknout." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Odstranit %(count)d epizodu?" msgstr[1] "Smazat %(count)d epizody?" msgstr[2] "Smazat %(count)d epizod?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Odstranění epizod smaže stažené soubory." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Odstraňování epizod" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Počkejte než budou epizody odstraněny" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Vybrat starší než %(count)d den" msgstr[1] "Vybrat starší než %(count)d dny" msgstr[2] "Vybrat starší než %(count)d dnů" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Vybrat přehrané" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Vybrat dokončené" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Vyberte episody, které chcete odstranit:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Odstranit epizody" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Žádný podcast nebyl vybrán" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Vyberte podcast ze seznamu, který chcete aktualizovat" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Chyba stahování při stahování %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Chyba stahování" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Vyberte episody, které chcete stáhnout:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Označit jako staré" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Zkontrolovat nové epizody později." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Žádné nové epizody" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Přihlašování na gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Přihlaste se ke stažení vašich odběrů" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Odběry na gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Vyberte podcast, který chcete upravit." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Odstranit podcasty" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Vyberte který podcast chcete odstranit" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Odstranit" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Odstraňování podcastu" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Počkejte na odstranění podcastu" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Chcete odstranit tento podcast a jeho epizody?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Odstraňování podcastů" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Počkejte než budou podcasty odstraňeny" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Opravdu chce odstranit vybrané podcasty a jejich epizody?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Vyberte ze seznamu podcast který chcete odstranit" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Soubory OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importovat z OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importovat podcasty z OPML souboru" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nic k exportování" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Váš seznam podcastů je prázdný. Začněte odebírat nějaké podcasty, a potom " "můžete exportovat jejich seznam." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportovat do OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d podcast exportován" msgstr[1] "%(count)d podcasty exportovány" msgstr[2] "%(count)d podcastů exportováno" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Seznam vašich podcastů byl úspěšně exportován" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Export do OPML souboru se nezdařil. Zkontrolujte svá oprávnění." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Export do OPML selhal" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Žádné aktualizace nejsou k dispozici" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Máte poslední verzi gPodderu." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Je k dispozici nová verze" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Nainstalovaná verze: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Nejnovější verze: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Datum vydání: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Stáhnout nejnovější verzi z gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "O aplikaci gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Přispět/Kniha přání" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Nahlásit problém" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Vít Stanislav\n" "David Štancl\n" "Petr Šimáček" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Přeložili:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Poděkování patří:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Vyberte epizodu se seznamu, u které chcete zobrazit poznámky" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Žádná vybraná epizoda" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "gPodder nelze spustit" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus chyba: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "od %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Celé číslo" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Desetinné číslo" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Logická hodnota" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Řetězec" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Přihlášení" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Zaplaceno Flattrem" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "vydáno %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "přehráno" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "nepřehráno" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "dnes" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "staženo %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Odstraněno" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nová epizoda" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Stažená epizoda" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Stažená video epizoda" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Stažený obrázek" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Stažený soubor" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "chybějící soubor" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nikdy nezobrazeno" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nikdy nepřehráno" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nikdy neotevřeno" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "zobrazené" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "otevřené" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "zabráněno odstranění" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Všechny epizody" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "ze všech podcastů" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Odběr pozastaven" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nic k vložení" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Schránka je prázdná" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Jméno" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Nový uživatel" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Přihlásit" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Nutná autentizace" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Heslo" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Výběr umístění" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Nastavení" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Nastavit na" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "%(field)s nemohlo být nastaveno na %(value)s. Požadovaný typ: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Chyba při nastavování možnosti" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nic nedělat" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Zobrazit seznam epizod" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Přidat do seznamu stahovaných" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Stáhnout ihned" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Žádný" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Založený na souborovém systému" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Označit jako přehrané" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Odstranit z aplikace gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Chyba" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Vlastní (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Jméno" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Délka" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Info o přídavném modulu" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Přihlaste se prosím do služby Flattr a podpory vydavatelů" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Přihlášení do služby Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Přihlášení jako %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Odhlásit se" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Integrace služby Flattr vyžaduje WebKit/GTK." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk nebyl nalezen" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Rozšíření nemůže být aktivováno" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Info o přídavném modulu" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Nastavit přehrávač audia" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Příkaz:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Nastavit přehrávač videa" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "ručně" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "po %(count)d dni" msgstr[1] "po %(count)d dnech" msgstr[2] "po %(count)d dnech" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Nahradit seznam podcastů na serveru" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcasty na serveru, které nejsou v místním seznamu, budou smazány. " "Pokračovat?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Vyberte složku pro přípojný bod" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Vyberte složku pro přípojný bod" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Hledat" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Na zadané URL adrese se nenachází žádný platný OPML podcast." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nebyly nalezeny žádné zdroje" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Žádné kanály YouTube nevyhovují hledanému výrazu." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nenalezeny žádné kanály" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Vybrat vše" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Zrušit výběr" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nic není vybráno" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d epizoda" msgstr[1] "%(count)d epizody" msgstr[2] "%(count)d epizod" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "velikost: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Zdroj na %(url)s se nepodařilo aktualizovat." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Chyba při otevírání přehrávače" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Přidat sekci" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nová sekce:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Vyberte obal nového podcastu" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Sem patří pouze jediný obrázek nebo URL adresa." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Táhni a pusť" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Sem můžete přetáhnout pouze místní soubory a http:// adresy." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Žádné nastavené zařízení" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Nastavte, prosím, zařízení v dialogu předvoleb." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Nelze otevřít zařízení" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Zkontrolujte nastavení v dialogu Předvolby." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Na zařízení není dostatek místa." #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Další volné vyžadované místo: %(required_space)s\n" "Chcete pokračovat?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Seznam byl úspěšně nahrán" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Chyba při převádění souboru" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Vše" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Skrýt odstraněné" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Stáhnuté" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archivované" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Videa" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Částečně přehráno" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Nepřehraná stažení" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Flattrován (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Flattrovat (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Přihlásit se do služby Flattr v nastavení" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flattrování epizody" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Nelze se přihlásit do služby Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Odstranit" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Odeslat odběry..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Chyba nahráváni:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Aktualizovat vše" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Aktualizovat" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Přejmenovat" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Změnit oddíl" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Přestat odebírat" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Sloučení akcí epizody ..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Sloučení akcí epizody (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Odstranit tento podcast a epizody?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Jméno nové sekce:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nové jméno:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Odstranit tuto epizodu?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Označit jako nové" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Povolit odstranění" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Přidat to fronty" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Přidávání podcastů..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Některé podcasty nemohly být přidány" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Pokračovat" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Neznámá stopa" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s na Soundcloudu" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Stopy publikoval %s na Soundcloudu" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Oblíbené od %s na Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Sledovat oblíbené %s na Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Stahování titulků z TED Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Stáhne .srt titulky z TED Talks videí" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Převést video soubory do MP4 pro Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Převede všechna videa na Rockbox kompatibilní formát" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Soubor převeden" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu App indikátor" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Zobrazit indikátor na horní liště" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Zobrazit hlavní okno" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Ukončit" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Zobrazit postup stahování v ikoně Unity spouštěče" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Po stažení přejmenovat epizody" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Po stažení přejmenovat epizody na \".\"" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Při převodu došlo k chybě" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Překódovat .ogg soubory. mp3 pomocí ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Převést na %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Při převodu došlo k chybě" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Odstranit přebal z OGG souborů" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Odstraní přebaly ze všech stažených ogg souborů" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Odstranit přebal" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Zařadit do fronty přehrávačů médií" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Přidat do kontextového menu položku zařazených epizod do fronty v " "nainstalovaných přehrávačích médií" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Zařadit do" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Při otevření programu hledat nové epizody" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Začít hledat nové epizody při startu programu" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizovat audio" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizovat úroveň hlasitosti" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Normalizace proběhla" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Gtk stavová ikona" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Zobrazit stavovou ikonu pro desktopy založené na Gtk" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimalizovat na startu" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Zminimalizuje okno aplikace gPodder na startu" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Při převodu došlo k chybě" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Překódovat .ogg soubory. mp3 pomocí ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Označit stažené soubory pomocí Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Přidat názvy epizod a podcastů do MP3/OGG tagů" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integrace s Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Zobrazit postup stahování v ikoně Unity spouštěče" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Přidat nový podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor podcastů" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Oddíl:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Zakázat aktualizace zdroje (pozastavit odběr)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Synchronizovat s MP3 přehrávačem" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Strategie" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Obecné" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP autentizace" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Jméno:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Heslo:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Umístění" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Stáhnout do:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Webová stránka:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "popisek stránky" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Pokročilé" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor kanálů" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Hledat:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Zobrazit vše" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Zkontrolovat nové epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Stáhnout nové epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Nastavení" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Odběry" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Objevit nové podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Přidat URL podcastu" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importovat z OPML souboru" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportovat do OPML souboru" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Jít na gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Přehrát" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Otevřít" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Přepnout na nový status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Přepnout příznak smazání" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "D_alší funkce" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Synchronizovat se zařízením" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Zobrazit" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Všechny epizody\" v seznamu podcastů" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Používat sekce v seznamu podcastů" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Nástrojová lišta" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Popis epizod" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Skrýt odstraněné epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Stažené epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Nepřehrané epizody" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Skrýt podcasty bez epizod" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Nápověda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Uživatelský návod" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Softwarové aktualizace" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtr:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Omezit ryhclost na" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Omezit počet stahování na" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Vybrat epizody" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Úvodem" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Vítejte v gPodderu" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Seznam podcastů je prázdný." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Vybrat ze seznamu ukázkových podcastů" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Přidejte podcast zadáním jeho URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Obnovit mé odběry z gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Přehrávač audia:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Přehrávač videa:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Preferovaný formát videa" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Rozšíření" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Automaticky použít službu Flattr při přehrávání epizod" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synchronizace odběrů a akcí epizod" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Nahradit seznam na serveru místními odběry" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Jméno zařízení" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Interval aktualizace:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maximální počet epizod v podcastu:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Když jsou nalezeny nové epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Aktualizace" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Odstranit přehrané epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Odstranit i epizody nepřehrané až do konce" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Odstranit i nepřehrané epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Vyčistit" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Typ zařízení:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Přípojný bod:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Po synchronizaci epizody" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Nahradit seznam na serveru" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Seznam k přehrání je prázdný" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Synchronizace pouze nepřehraných epizod" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Zařízení" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Upravit nastavení" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Hledat nové podcasty" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Vybrat vše" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Zrušit výběr" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Hledat" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Nejlepší _podcasty" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Přehrávané nyní" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Přidávání podcastů" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Nastavení" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "O programu" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Poděkování" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Zásluhy" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Zásluhy" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Jméno zařízení" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Nastavení gPodderu" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientace displeje" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Automatické otočení" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indexace médií" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Zobrazit podcasty v aplikaci Music" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Automaticky použít službu Flattr při přehrávání" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Povolit synchronizaci" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Přihlašování na gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Nahradit seznam na serveru" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Nemáte účet? Registrujte se zde" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Přehrát frontu" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Seznam k přehrání je prázdný" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detaily epizody" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Stažené epizody" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Přehrát epizody" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Poznámky" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Vybrat stažené" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Obrátit výběr" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Žádné podcasty" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Nyní přidejte první podcast." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Žádné epizody" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Dotykem změníte filtr" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Zobrazit epizody" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Hledaný výraz nebo URL adresa" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Seznam nejlepších" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Můj gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Příklady" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "běží na gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Odebírat" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuta" msgstr[1] "%(count)s minuty" msgstr[2] "%(count)s minut" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s sekunda" msgstr[1] "%(count)s sekundy" msgstr[2] "%(count)s sekund" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Datum vydání: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Aktualizace podcastů vyžadované rozšířeními." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Stažení epizody vyžadované rozšířeními." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "Neplatná url: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Neodebíráte %s" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "%s nelze odebírat" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "%s nelze odebírat" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s úspěšně přidáno " #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Tato možnost nastavení neexistuje." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Lze nastavit jen koncové větve konfigurace." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "%(old_title)s přejmenováno na %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Zrušeno odebírání %s" #: bin/gpo:473 msgid "Updates disabled" msgstr "Aktualizace zakázány" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d nová epizoda" msgstr[1] "%(count)d nové epizody" msgstr[2] "%(count)d nových epizod" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Zkontrolovat nové epizody" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Přeskakování %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Zakázána aktualizace kanálu z %s" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Povolena aktualizace kanálu z %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Naslouchá se na VŠECH síťových rozhraních." #: bin/gpo:622 msgid "No podcasts found." msgstr "Nebyly nalezeny žádné podcasty" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Pro přihlášení zadejte pořadové číslo, ? vypíše seznam" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Neplatná hodnota" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Neplatná URL adresa: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL adresa změněna z %(old_url)s na %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Chyba syntaxe: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Nejednoznačný příkaz. Mysleli jste..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "Požadovaná funkce není dostupná." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "Vytisknout výstup logování na konzoli" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "Použít QML-založené MeeGo 1.2 Harmattan UI" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "Přihlásit k odběru na adrese URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X: číslo procesu" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Podcast klient gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast klient" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Odebírat audio a video obsah z internetu" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Převést .flv soubory z YouTube na .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "Vhodné pro přehrávání stažených videí na mp4 přehrávačích" #~ msgid "Convert FLV to MP4" #~ msgstr "Převést FLV na MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Převést M4A na MP3 nebo OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Převést .mp4a soubory na .mp3 nebo .ogg za použití ffmpeg" #~ msgid "Convert OGG audio to MP3" #~ msgstr "Převést OGG zvuk do MP3" #~ msgid "File converted from ogg to mp3" #~ msgstr "Soubor převeden z ogg do mp3" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Převedení z ogg do mp3 selhalo" gpodder-3.5.2/po/da.po0000644000175000017500000020243212220345607014123 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # <3xm@detfalskested.dk>, 2011. # Jon Hedemann , 2012. # Thomas Perl , 2009. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Danish (http://www.transifex.com/projects/p/gpodder/language/" "da/)\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder på %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "for %(count)d dag siden" msgstr[1] "for %(count)d dage siden" #: src/gpodder/util.py:495 msgid "Today" msgstr "I dag" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "I går" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(ukendt)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekund" msgstr[1] "%(count)d sekunder" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d time" msgstr[1] "%(count)d timer" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minut" msgstr[1] "%(count)d minutter" #: src/gpodder/util.py:1245 msgid "and" msgstr "og" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Afbrudt af bruger" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Skriver data til disk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Åbner iPod-database" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod åbnet" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Gemmer iPod-database" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Gemmer udvidet gtkpod-database" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Fjerner %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Tilføjer %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "Fejl under kopiering af %(episode)s: Ikke plads nok på %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Åbner MP3-afspiller" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3-afspiller åbnet" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Fejl ved åbning af %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-enhed" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Åbner MTP-enheden" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s åbnet" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Lukker %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s lukket" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Tilføjer %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Tilføjet" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Sat i kø" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synkronisering" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Afsluttet" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fejlet" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Annulleret" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Sat på pause" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Fejl: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Tilføj %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Fjern %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 #, fuzzy msgid "Invalid request" msgstr "Ugyldig URL" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Ingen abonnementer" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Ingen tilgængelig beskrivelse" #: src/gpodder/model.py:679 msgid "unknown" msgstr "ukendt" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Andet" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Lyd" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Forkert brugernavn/adgangskode" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Downloader" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Manglende data fra server" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O-fejl: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-fejl: %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Heltal" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Sæt download på pause" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Ingen beskrivelse tilgængelig." #: src/gpodder/extensions.py:213 #, fuzzy, python-format msgid "Command not found: %(command)s" msgstr "Brugerkommando ikke fundet" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python-modulet \"%s\" er ikke installeret" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Kommando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Standardprogram" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Indlæser uafsluttede downloads" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Download af nogle episoder er ikke blevet afsluttet i en tidligere " "programsession." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d delvis fil" msgstr[1] "%(count)d delvise filer" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Genoptag alle" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Der blev fundet uafsluttede downloads fra en tidligere programsession." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Handling" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Bekræft ændringer fra gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Vælg de handlinger, du ønsker at udføre." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Overfører abonnementer" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Din abonnementsliste overføres til serveren." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Abonnementsliste overført." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Overførselsfejl" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episode" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Størrelse" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Varighed" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Udgivet" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Synlige kolonner" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Status" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Indlæser episoder" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Ingen episoder i aktuel visning" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Ingen tilgængelige episoder" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Ingen podcasts i denne visning" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Ingen abonnementer" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Ingen aktive downloads" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktiv" msgstr[1] "%(count)d aktive" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fejlet" msgstr[1] "%(count)d fejlede" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d sat i kø" msgstr[1] "%(count)d sat i kø" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "downloader %(count)d fil" msgstr[1] "downloader %(count)d filer" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Rapportér dette problem og genstart gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Uhåndteret undtagelse" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Fejl i feedparser: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Kunne ikke tilføje én eller flere podcasts" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Downloads fuldført" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Downloadfejl" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Kunne ikke tilføje én eller flere podcasts" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Synkronisering afsluttet." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Enhed synkroniseret" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episode mere" msgstr[1] "%(count)d episoder mere" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Episodebeskrivelse" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Start download nu" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Download" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Annullér" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Sæt på pause" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Fjern fra abonnementsliste" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Opdatér podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Åbn downloadmappe" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Mark episoder som gamle" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arkiv" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Fjern podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast-indstillinger" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Filkonverteringsfejl." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Filoverførsel via Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Eksempel" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Stream" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Send til" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokal mappe" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth-enhed" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Ny" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Kontrollér det valgte afspilningsprogram under enhedsindstillingerne." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Fejl ved åbning af afspiller" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Tilføjer podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Vent venligst, mens episodebeskrivelserne downloades." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Eksisterende abonnementsliste sprunget over" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Du abonnerer allerede på disse podcasts" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast kræver godkendelse" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Log venligst ind på %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Godkendelse mislykket" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Omdirigering fra hjemmeside detekteret" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL'en %(url)s omdirigeres til %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Ønsker du at besøge hjemmesiden nu?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Kunne ikke tilføje én eller flere podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Én eller flere podcasts kunne ikke føjes til din abonnementsliste:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Ukendt" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Omdirigering detekteret" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Synkroniserer episodehandlinger" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Episodehandlinger fra gpodder.net er nu synkroniseret med enhed." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Annullerer..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nyt navn:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Opdaterer %(count)d feed..." msgstr[1] "Opdaterer %(count)d feeds..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Fejl ved opdatering af %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Feedet %(url)s kunne ikke opdateres." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Fejl ved opdatering af feed" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Har opdateret %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Ingen nye episoder" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Downloader %(count)d ny episode." msgstr[1] "Downloader %(count)d nye episoder." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nye episoder tilgængelige" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d ny episode føjet til downloadslisten." msgstr[1] "%(count)d nye episoder føjet til downloadlisten." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d ny episode tilgængelig" msgstr[1] "%(count)d ny episoder tilgængelige" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Afslut gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Du downloader episoder. Du kan genoptage download af disse episoder næste " "gang du starter gPodder. Ønsker du at afslutte nu?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Episoderne er låst" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "De valgte episoder er låst. Lås de episoder op, som du ønsker at slette, " "inden du forsøger at slette dem." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Slet %(count)d episode?" msgstr[1] "Slet %(count)d episoder?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Sletning af episoder fjerner downloadede filer." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Sletter episoder" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Vent venligst, mens episoderne slettes" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Vælg ældre end %(count)d dag" msgstr[1] "Vælg ældre end %(count)d dage" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Vælg afspillede" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Valgt afsluttet" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Vælg de episoder, du ønsker at slette:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Slet episoder" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ingen podcast valgt" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Vælg en podcast fra listen for at opdatere den." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Fejl under download af %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Downloadfejl" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Vælg de episoder, du ønsker at downloade:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Markér som gammel" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Søg efter nye episoder senere." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Ingen nye episoder til rådighed" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Log ind på gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Log ind for at downloade dine abonnementer." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Abonnementer på gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Vælg en podcast fra listen for at redigere den." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Fjern podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Vælg de episoder, du ønsker at fjerne." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Fjern" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Fjerner podcasts" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Vent venligst, mens denne podcast fjernes" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Ønsker du at fjerne denne podcast og alle de downloadede episoder?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Fjerner podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Vent venligst, mens disse podcasts fjernes" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Ønsker du at fjerne de valgte podcasts og alle de downloadede episoder?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Vælg en podcast fra listen for at fjerne den." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML-filer" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importér fra OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importér podcasts fra OPML-fil" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Intet at eksportere" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Din podcastabonnementsliste er tom. Abonnér på podcasts, inden du forsøger " "at eksportere abonnementslisten." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Eksportér til OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d abonnement eksporteret" msgstr[1] "%(count)d abonnementer eksporteret" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Eksport af podcastliste udført." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Kunne ikke eksportere OPML til fil. Kontrollér dine filrettigheder." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Fejl ved OPML-eksport" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Ingen tilgængelige episoder" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Nye episoder tilgængelige" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Sletter: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "udgivet: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Download mine abonnementer fra gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Om gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donér / ønskeseddel" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Rapportér et problem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Jon Hedemann" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Oversættelse af:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Tak til:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Vælg en episode fra listen for at få vist episodebeskrivelsen." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Ingen episode valgt" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Kan ikke starte gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus-fejl: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "fra %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Heltal" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Kommatal" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolsk værdi" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Tekststreng" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "udgivet %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "afspillet" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "uafspillet" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "i dag" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "downloaded %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Slettet" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Ny episode" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Download episode" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Download video-episode" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Downloaded billede" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Downloaded fil" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "manglende fil" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "aldrig vist" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "aldrig afspillet" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "aldrig åbnet" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "vist" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "åbnet" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "sletning forhindret" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alle episoder" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "fra alle podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Abonnement sat på pause" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Intet at indsætte." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Udklipsholder er tom" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Brugernavn" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Ny bruger" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Log ind" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Kræver godkendelse" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Adgangskode" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Vælg destination" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Indstilling" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Indstil til" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Kan ikke indstille %(field)s til %(value)s. Nødvendig datatype: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Fejl ved lagring af indstilling" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Gør intet" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Vis episodeliste" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Føj til downloadliste" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Download straks" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ingen" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Filsystem-baseret" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Markér som uafspillet" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Slet fra gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Fejl: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Særlige format-tekststrenge" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Varighed" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Konfigurér lydafspiller" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Konfigurér videoafspiller:" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuelt" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "efter %(count)d dag" msgstr[1] "efter %(count)d dage" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Erstat abonnementsliste på server" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Server-podcasts, der ikke er tilføjet lokalt, fjernes fra serveren. Fortsæt?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Vælg mappe som indlæsningspunkt" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Vælg mappe som indlæsningspunkt" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Søg" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Den angivne adresse giver ingen gyldige OPML-podcasts." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Ingen feeds fundet" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Der findes ingen YouTube-kanaler, der matcher din søgning." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Ingen kanaler fundet" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Vælg alle" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Vælg ingen" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Intet valgt" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episode" msgstr[1] "%(count)d episoder" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "størrelse: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Feedet %(url)s kunne ikke opdateres." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Fejl ved åbning af afspiller" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Handling" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nyt navn:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Vælg nyt podcast-billede" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Du kan kun indsætte et enkelt billede eller en enkelt URL her." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Drag and drop" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Du kan kun indlægge lokale filer og HTTP://-adresser her." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Ingen enhed konfigureret" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Vælg din enhed i vinduet Indstillinger." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Kan ikke åbne enhed" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Kontrollér din konfiguration i vinduet Indstillinger." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Ikke plads nok tilbage på enheden" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Mangler ledig hukommelse på %s.\n" "Vil du fortsættee?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Abonnementsliste overført." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Filkonverteringsfejl." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alle" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Skjul slettede episoder" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Downloaded" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Arkiv" #: src/gpodder/qmlui/__init__.py:71 #, fuzzy msgid "Videos" msgstr "Video" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Markér som uafspillet" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "uafspillet download" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "efter %(count)d dag" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "efter %(count)d dag" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Sletter episoder" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Kunne ikke fjerne podcast." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Slet" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Overfører abonnementer..." #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Overførselsfejl" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Opdater alle" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Opdater" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Omdøb" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Skift kategori" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Fjern abonnement" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Fletter episodehandlinger..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Fletter episodehandlinger (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Fjern dette podcast og episoder?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Navn på ny kategori:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nyt navn:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Slet denne episode?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Markér som ny" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Tillad sletning" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Lydafspiller:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Tilføjer podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Kunne ikke tilføje én eller flere podcasts" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Genoptag alle" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Ukendt spor" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s på Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Spor udgivet af %s på Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s favoritter på Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Favoritnumre udvalgt af %s på Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "iPod OGG-konverter" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Afslut" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "én episode downloadet:" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Der er ingen nye episoder til download" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Konverterer fil" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Konverterer fil" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Vælg cover fra fil" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Fjern podcast" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Søg efter nye episoder ved opstart" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Søg efter nye episoder ved opstart" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Filnavn" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Statusikon" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Konverterer fil" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Vis \"Alle episoder\" i podcastlisten" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Tilføj ny podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Podcast-editor for gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Kategori:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Deaktivér feedopdateringer (sæt abonnement på hold)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synkroniserer til afspiller" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Sletningsprincip:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Generelt" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP-/FTP-godkendelse" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Brugernavn:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Adgangskode:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Placeringer" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Download til:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Hjemmeside:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "Nøgleord for hjemmeside" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanceret" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Opsætningseditor for gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Søg efter:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Vis alle" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Søg efter nye episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Download nye episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Indstillinger" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Abonnementer" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Opdag nye podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Tilføj podcast via URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importér fra OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Eksportér til OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gå til gpodder.org" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Afspil" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Åbn" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Skift \"ny\"-status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Skift sletningslåsekode" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Synkronisér med enhed" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Vis" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Alle episoder\" i podcast-liste" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Brug kategorier til podcast-liste" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Værktøjslinje" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Episodebeskrivelser" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Skjul slettede episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Downloadede episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Uafspillede episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Skjul podcasts uden episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Hjælp" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Brugermanual" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Begræns hastigheden til" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Begræns downloads til" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Vælg episoder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Indstillinger" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Velkommen til gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Din abonnementsliste er tom." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Vælg fra listen over eksempler på podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Tilføj podcast via URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Download mine abonnementer fra gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Lydafspiller:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Videoafspiller:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Download altid nye episoder automatisk" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synkronisér abonnementer og episodebeskrivelser" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Erstat listen på serveren med lokale abonnementer" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Enhedsnavn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Opdateringsinterval:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maks. antal episoder pr. podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Når nye episoder er fundet:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Opdaterer" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Slet afspillede episoder:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Fjern afspillede episoder selvom de kke er lyttet til ende" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Fjern også uafspillede episoder" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Oprydning" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Enhedstype:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Indlæsningspunkt:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Efter synkronisering af en episode:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Erstat abonnementsliste på server" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Navn til afspilningsliste:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Synkronisér kun uafspillede episoder" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Enheder" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Redigér konfigurationsfil" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Find nye podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Vælg alle" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Vælg ingen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Search" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Top _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Nu afspilles" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Tilføjer podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Indstillinger" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Om" #: share/gpodder/ui/qml/main_default.qml:168 #, fuzzy msgid "Thanks" msgstr "Tak til:" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Enhedsnavn:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "Indstillinger for gpodder.net" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Visningsretning" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Automatisk oprydning" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Ingen podcasts i denne visning" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Genoptag afspilning" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Efter synkronisering:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Log ind på gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Erstat abonnementsliste på server" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Afspillet" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Navn til afspilningsliste:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Episodebeskrivelse" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Downloadede episoder" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Afspil episode" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Beskrivelse" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Vælg downloadmappe" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Invertér valgte" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Ingen podcasts" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Ingen nye episoder" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Vis episodeliste" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Søgeord eller URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Topliste" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Eksempler" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "Drevet af gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Abonnér" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minut" msgstr[1] "%(count)s minutter" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s sekund" msgstr[1] "%(count)s sekunder" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "udgivet: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "udgivet: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Podcast kræver godkendelse" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Ugyldig URL" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Du abonnerer allerede på disse podcasts" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Kan ikke synkronisere med iPod" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Kan ikke synkronisere med iPod" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Fjern abonnement" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Opdatér valgte" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d ny episode" msgstr[1] "%(count)d nye episoder" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Søger efter nye episoder..." #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Springer podcast over: %s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Indlæser filer fra %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Ingen podcasts fundet" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 #, fuzzy msgid "Invalid value." msgstr "Ugyldig URL" #: bin/gpo:671 #, fuzzy, python-format msgid "Invalid URL: %s" msgstr "Ugyldig URL" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Denne funktion er ikke tilgængelig på iPods." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Send debugging-output til stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Abonner på den angivne URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X applikationsprocesnummer" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder podcast-klient" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast-klient" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Abonner på lyd- og videoindhold fra nettet" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "iPod OGG-konverter" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konverterer fil" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Vent venligst..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Start gPodders QML-grænseflade" gpodder-3.5.2/po/de.po0000644000175000017500000021133412220345610014122 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Thomas Perl , 2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-04-10 17:52+0100\n" "Last-Translator: Thomas Perl \n" "Language-Team: German (http://www.transifex.com/projects/p/gpodder/language/" "de/)\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.4\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder auf %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "vor %(count)d Tag" msgstr[1] "vor %(count)d Tagen" #: src/gpodder/util.py:495 msgid "Today" msgstr "Heute" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Gestern" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(unbekannt)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d Sekunde" msgstr[1] "%(count)d Sekunden" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d Stunde" msgstr[1] "%(count)d Stunden" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d Minute" msgstr[1] "%(count)d Minuten" #: src/gpodder/util.py:1245 msgid "and" msgstr "und" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Vom User abgebrochen" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Schreibe Daten auf das Gerät" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Öffnen iPod-Datenbank" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod geöffnet" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Speichere iPod-Datenbank" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Schreibe erweiterte gtkpod-Datenbank" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Entferne %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Füge %s hinzu" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Fehler beim Kopieren von %(episode)s: Nicht genügend freier Speicher auf " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Öffne MP3-Player" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3-Player geöffnet" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Fehler beim Öffnen von %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-Gerät" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Öffne MTP-Gerät" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s geöffnet" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Schließe %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s geschlossen" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Füge %s hinzu..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Hinzugefügt" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Eingereiht" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Synchronisiere" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Fertig" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fehlgeschlagen" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Abgebrochen" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pause" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Fehler: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Abonniere %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Entferne %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Nicht genügend Mittel, um zu flattrn" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Item existiert nicht auf Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Bereits geflattred oder eigenes Item" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Ungültiger Request" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Keine Internet-Verbindung" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Keine Beschreibung" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Keine Beschreibung verfügbar" #: src/gpodder/model.py:679 msgid "unknown" msgstr "unbekannt" #: src/gpodder/model.py:744 msgid "Default" msgstr "Standard" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Nur Neueste behalten" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Andere" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Falscher Benutzername/Passwort" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Herunterladen" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Fehlender Inhalt vom Server" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Fehler: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-Fehler %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Desktop-Integration" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Oberfläche" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Nach Downloads" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Keine Beschreibung für diese Erweiterung." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Befehl nicht gefunden: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Brauche zumindest eines der folgenden Kommandos: %(list_of_commands)s" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Python-Modul nicht gefunden: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Kommando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Standard-Programm" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Lade unvollständige Downloads" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Einige Episoden wurden das letzte Mal nicht vollständig heruntergeladen." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d unvollständige Datei" msgstr[1] "%(count)d unvollständige Dateien" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Alle fortsetzen" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Unvollständige Downloads von einer früheren Sitzung gefunden." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Aktion" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Änderungen von gpodder.net bestätigen" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Wählen Sie die Aktionen, die Sie ausführen möchten." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Lade Abonnements hoch" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Ihre Abonnements werden auf den Server geladen." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Upload der Liste erfolgreich." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Fehler beim Upload" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episode" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Größe" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Dauer" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Veröffentlicht" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Sichtbare Spalten" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Fortschritt" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Lade Episoden" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Keine Episoden in dieser Ansicht" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Keine Episoden verfügbar" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Keine Podcasts in dieser Ansicht" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Keine Abonnements" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Keine aktiven Tasks" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktiv" msgstr[1] "%(count)d aktiv" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fehlgeschlagen" msgstr[1] "%(count)d fehlgeschlagen" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d eingereiht" msgstr[1] "%(count)d eingereiht" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "lade %(count)d Datei herunter" msgstr[1] "lade %(count)d Dateien herunter" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "synchronisiere %(count)d Datei" msgstr[1] "synchronisiere %(count)d Dateien\t" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d eingereiht" msgstr[1] "%(queued)d eingereiht" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Bitte diesen Fehler melden und gPodder neu starten:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Nicht behandelter Fehler" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Feedparser-Fehler: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Einige Podcasts konnten nicht heruntergeladen werden:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Downloads abgeschlossen" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Downloads fehlgeschlagen" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Einige Podcasts konnten nicht synchronisiert werden:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Geräte-Synchronisation abgeschlossen" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Geräte-Synchronisation fehlgeschlagen" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d weitere Episode" msgstr[1] "%(count)d weitere Episoden" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Episoden-Details" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Sofort herunterladen" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Download" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Abbrechen" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pause" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Von Liste entfernen" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Podcast aktualisieren" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Download-Ordner öffnen" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Episoden als alt markieren" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivieren" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Podcast entfernen" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast-Einstellungen" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Fehler beim Konvertieren der Datei." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth Dateitransfer" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Vorschau" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Streamen" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Senden an" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokaler Ordner" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth-Gerät" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Neu" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Jetzt flattrn" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Flattr-Status" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Bitte überprüfen Sie die Medien-Player-Einstellungen." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Fehler beim Öffnen des Players" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Füge Podcasts hinzu" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Bitte warten - Episoden-Informationen werden heruntergeladen." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Existierende Abonnements übersprungen" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Sie haben diese Podcasts bereits abonniert:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast benötigt Authentifizierung" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Bitte auf %s einloggen:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Authentifizierung fehlgeschlagen" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Webseiten-Weiterleitung erkannt" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "Die URL %(url)s leitet zu %(target)s weiter." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Wollen Sie die Webseite jetzt besuchen?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Einige Podcasts konnten nicht hinzugefügt werden" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Einige Podcasts konnten nicht zur Liste hinzugefügt werden:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Unbekannt" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Weiterleitung erkannt" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Verarbeite Episoden-Aktionen" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Episoden-Aktionen von gpodder.net werden verarbeitet." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Abbrechen..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Bitte zu einem Netzwerk verbinden, dann erneut versuchen." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Keine Netzwerk-Verbindung" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Aktualisiere %(count)d Feed..." msgstr[1] "Aktualisiere %(count)d Feeds..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Fehler beim Aktualisieren von %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Der Feed unter %(url)s konnte nicht aktualisiert werden." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Fehler beim Aktualisieren des Feeds" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s aktualisiert (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Keine neuen Episoden" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Lade %(count)d neue Episode herunter." msgstr[1] "Lade %(count)d neue Episoden herunter." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Neue Episoden verfügbar" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d neue Episode zur Download-Liste hinzugefügt." msgstr[1] "%(count)d neue Episoden zur Download-Liste hinzugefügt." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d neue Episode verfügbar" msgstr[1] "%(count)d neue Episoden verfügbar" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "gPodder beenden" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Sie laden momentan Episoden herunter. Sie können den Download beimnächsten " "Start von gPodder fortsetzen. Wollen Sie gPodder jetzt beenden?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Episoden sind geschützt" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Die gewählten Episoden sind geschützt. Bitte heben Sie den Schutz für die " "Episoden, die Sie löschen wollen auf, bevor Sie versuchen, sie zu löschen." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "%(count)d Episode löschen?" msgstr[1] "%(count)d Episoden löschen?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Das Löschen von Episoden entfernt heruntergeladene Dateien." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Lösche Episoden" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Bitte warten - Episoden werden gelöscht" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Älter als %(count)d Tag auswählen" msgstr[1] "Älter als %(count)d Tage auswählen" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Abgespielte auswählen" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Fertige auswählen" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Wählen Sie die Episoden, die Sie löschen möchten:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Episoden löschen" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Kein Podcast ausgewählt" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Bitte einen Podcast aus der Liste auswählen, um ihn zu aktualisieren." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Fehler beim Herunterladen von %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Download-Fehler" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Wählen Sie die Episoden, die Sie herunterladen möchten:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Als alt markieren" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Bitte schauen Sie später nach neuen Episoden." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Keine neuen Episoden verfügbar" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Login auf gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Einloggen, um Abonnements herunterzuladen." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Abonnements auf gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Bitte wählen Sie einen Podcast aus ihrer Liste, um ihn zu editieren." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Podcasts entfernen" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Wählen Sie die Podcasts, die Sie löschen wollen." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Entfernen" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Entferne Podcasts" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Bitte warten - der Podcast wird gelöscht" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Diesen Podcast und heruntergeladene Episoden wirklich entfernen?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Podcasts werden entfernt" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Bitte warten - Podcasts werden entfernt" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Gewählte Podcasts und heruntergeladene Episoden wirklich entfernen?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" "Bitte einen Podcast in der Podcast-Liste auswählen, um ihn zu entfernen." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML Dateien" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Von OPML importieren" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Podcasts von OPML-Datei importieren" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nichts zu exportieren" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Ihre Podcast-Abonnement-Liste ist leer. Bitte abonnieren Sie zuerst " "Podcasts, bevor Sie versuchen, die Abonnement-Liste zu exportieren." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Als OPML-Datei exportieren" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d Abonnement exportiert" msgstr[1] "%(count)d Abonnements exportiert" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Ihre Podcast-Liste wurde erfolgreich exportiert." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Konnte OPML nicht als Datei exportieren. Bitte überprüfen Sie Ihre " "Berechtigungen." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML-Export fehlgeschlagen" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Keine Updates verfügbar" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Sie haben die aktuelle gPodder-Version." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Neue Version verfügbar" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Installierte Version: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Neueste Version: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Erscheinungsdatum: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Die neueste Version von gpodder.org laden?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Über gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Spenden / Wunschzettel" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Einen Fehler melden" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Thomas Perl" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Übersetzung von:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Dank an:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Bitte eine Episode aus der Liste wählen, um Show-Notes anzuzeigen." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Keine Episode ausgewählt" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "gPodder kann nicht gestartet werden" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus-Fehler: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "von %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Integer" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Float" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolesch" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "String" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Einloggen" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Geflattred" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "erschienen: %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "gespielt" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "nicht gespielt" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "heute" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "heruntergeladen: %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Gelöscht" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Neue Episode" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Heruntergeladene Episode" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Heruntergeladene Video-Episode" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Heruntergeladenes Bild" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Heruntergeladene Datei" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "Datei fehlt" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nie angezeigt" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nie abgespielt" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nie geöffnet" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "angezeigt" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "geöffnet" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "Löschsperre" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alle Episoden" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "von allen Podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Abonnement pausiert" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nichts einzufügen." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Zwischenablage ist leer" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Benutzername" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Neuer User" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Login" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Authentifizierung benötigt" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Passwort" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Ziel auswählen" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Einstellung" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Gesetzt auf" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Kann %(field)s nicht auf %(value)s ändern. Benötigter Datentyp: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Fehler beim Setzen der Option" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nichts tun" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Liste mit Episoden anzeigen" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Zur Download-Liste hinzufügen" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Sofort herunterladen" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Keine" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Dateisystem-basierter MP3 Player" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Als abgespielt markieren" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "In gPodder löschen" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Fehler" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Manuell (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Name" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Dauer" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Info zum Erweiterungs-Modul" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Bei Flattr einloggen und Publisher unterstützen" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Bei Flattr einloggen" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Eingeloggt als %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Ausloggen" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Flattr-Integration benötigt WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk nicht gefunden" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Erweiterung kann nicht aktiviert werden" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Info zum Erweiterungs-Modul" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Audio-Player einrichten" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Video-Player einrichten" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuell" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "nach %(count)d Tag" msgstr[1] "nach %(count)d Tagen" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Abonnement-Liste am Server ersetzen" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcasts am Server, die lokal nicht hinzugefügt werden, werden am Server " "entfernt. Fortfahren?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Ordner des Einhängepunkts wählen" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "Ordner für Playliste auswählen" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Suchen" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Die angegebene URL bietet keine gültigen OPML Podcasts an." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Keine Feeds gefunden" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Es gibt keine YouTube-Kanäle, die Ihrer Anfrage entsprechen." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Keine Kanäle gefunden" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Alle auswählen" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Nichts auswählen" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nichts ausgewählt" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d Episode" msgstr[1] "%(count)d Episoden" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "Größe: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "Der Ordner %s konnte nicht erstellt werden." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "Fehler beim Schreiben der Wiedergabeliste" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Sektion hinzufügen" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Neue Sektion:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Neues Podcast Cover Artwork auswählen" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Sie können nur ein Bild oder eine URL hier her ziehen." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Drag und Drop" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Sie können nur lokale Dateien und http://-URLs hier her ziehen." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Kein Gerät konfiguriert" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Bitte konfigurieren Sie Ihr Gerät im Einstellungs-Dialog." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Kann Gerät nicht öffnen" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Bitte überprüfen Sie die Einstellungen." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Ungenügend Speicherplatz am Gerät verfügbar" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Zusätzlicher Speicherplatz benötigt: %(required_space)s\n" "Wollen Sie trotzdem fortfahren?" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "Aktualisierung erfolgreich" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "Die Wiedergabeliste auf Ihrem MP3-Player wurde aktualisiert." #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "Episoden wurden am Gerät gelöscht" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "Fehler beim Schreiben der Wiedergabe-Liste" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alle" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Gelöschte verstecken" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Heruntergeladen" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archiviert" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Videos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Teilweise abgespielt" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Ungespielte Downloads" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Geflattred (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Jetzt flattrn (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "In den Einstellungen bei Flattr einloggen." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flattre Episode..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Login zu Flattr fehlgeschlagen." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Löschen" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Lade Abonnements hoch..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Fehler beim Upload:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Alle Aktualisieren" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Aktualisieren" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Umbenennen" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Sektion ändern" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Entfernen" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Verarbeite Episoden-Aktionen...." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Verarbeite Episoden-Aktionen (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Diesen Podcast und Episoden entfernen?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Neuer Sektions-Name:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Neuer Name:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Diese Episode löschen?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Als neu markieren" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Löschen erlauben" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Zur Wiedergabeliste hinzufügen" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Füge Podcasts hinzu..." #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "Einige Podcasts konnten nicht hinzugefügt werden:" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Fortsetzen" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Unbekannter Track" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s auf Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Tracks von %s auf Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s's Favoriten auf Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Favorisierte Tracks von %s auf Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Untertitel-Downloader für TED Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Lädt .srt-Untertitel für TED Talks-Videos herunter" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Video-Dateien in Rockbox-MP4 umwandeln" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Wandelt alle Videos in ein Rockbox-kompatibles Format um" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Datei umgewandelt" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu App-Indikator" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Einen Status-Indikator in der oberen Leiste anzeigen." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Hauptfenster anzeigen" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Beenden" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "Download-Fortschritt in der Taskbar anzeigen" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "Zeigt den Fortschritt in der Windows-Taskbar an." #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Episoden nach dem Download umbenennen" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Episoden werden zu \".\" umbenannt" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "Video-Dateien umwandeln" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "Video-Dateien in avi/mp4/m4v umwandeln" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Umwandeln in %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Umwandeln fehlgeschlagen" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Cover-Artwork in OGG-Dateien entfernen" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Entfernt Cover-Artwork von heruntergeladenen OGG-Dateien" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Cover-Artwork entfernen" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "In Media-Player-Playliste einreihen" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Fügt einen Kontext-Menü-Eintrag ein, um Episoden zur aktuellen Playliste " "hinzuzufügen" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Hinzufügen zur Playliste von" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Beim Start nach neuen Eipsoden suchen" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Sucht bei Programmstart nach neuen Episoden" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Lautstärke normalisieren (neu encodieren)" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Die Lautstärke von Audio-Files mit normalize-audio anpassen" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Datei normalisiert" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Gtk Status-Icon" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Ein Status-Icon für Gtk-basierte Desktops anzeigen." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "Zu Sonos streamen" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "Gibt Podcasts auf Sonos-Lautsprechern wieder" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Beim Start minimieren" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiert das gPodder-Fenster beim Start." #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "Audio-Dateien umwandeln" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "Audio-Dateien in mp3/ogg umwandeln" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Heruntergeladene Dateien mit Mutagen taggen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Episoden- und Podcast-Titel zu MP3/OGG-Tags hinzufügen" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integration für Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Fortschritt von Downloads im Launcher-Icon anzeigen." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Neuen Podcast hinzufügen" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Adresse:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder Podcast-Editor" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sektion:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Feed-Updates deaktivieren (Abonnement pausieren)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Mit portablen MP3-Playern synchronisieren" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Strategie:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Allgemeines" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP-Authentifizierung" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Benutzername:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Passwort:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Orte" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Herunterladen nach:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Webseite:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "Website Label" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Erweitert" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder Konfigurations-Editor" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Suche nach:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Alle anzeigen" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Nach neuen Episoden suchen" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Neue Episoden herunterladen" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Einstellungen" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Abonnements" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Neue Podcasts entdecken" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Podcast per URL hinzufügen" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Von OPML-Datei importieren" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Zu OPML-Datei exportieren" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gehe zu gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episoden" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Abspielen" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Öffnen" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Neu-Status wechseln" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Löschsperre ändern" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Mit Gerät synchronisieren" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ansicht" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Alle Episoden\" in Podcast-Liste" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Sektionen in Podcast-Liste verwenden" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Toolbar" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Episoden-Beschreibungen" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Gelöschte Episoden verstecken" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Heruntergeladene Episoden" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Nicht gespielte Episoden" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Podcasts ohne Episoden ausblenden" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Hilfe" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Benutzerhandbuch" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Software-Updates" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Rate limitieren auf" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Downloads limitieren auf" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Episoden auswählen" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Erste Schritte" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Willkommen bei gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Ihre Podcast-Liste ist leer." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Wähle Podcasts aus einer Liste von Beispiel-Podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Podcast durch URL-Eingabe hinzufügen" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Abonnements von gpodder.net wiederherstellen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Audio-Player:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Video-Player:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Bevorzugtes Video-Format:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Erweiterungen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Episoden beim Abspielen automatisch flattrn" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Abonnements und Aktionen synchronisieren" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Liste am Server mit lokalen Abonnements ersetzen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Gerät-Name:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Aktualisierungs-Intervall:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maximale Episoden pro Podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Bei neuen Episoden:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Aktualisieren" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Gespielte Episoden löschen:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Abgespielte Episoden löschen (auch wenn nicht fertig)" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Auch ungespielte Episoden löschen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Aufräumen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Gerät-Typ:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Einhängepunkt:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Nach dem Synchronisieren einer Episode:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "Wiedergabelisten am Gerät erstellen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "Ordner für Wiedergabelisten:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "Am Gerät gelöschte Episoden in gPodder entfernen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Nur ungespielte Episoden synchronisieren" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Geräte" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Konfiguration bearbeiten" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Neue Podcasts finden" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Alle auswählen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Nichts auswählen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Suche" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "_Podcast-Topliste" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Wiedergabe" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "Podcast hinzufügen" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Einstellungen" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Über" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Danksagungen" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Credits" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "gPodder.net Login" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "Zugangsdaten" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Gerätename" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "gPodder Einstellungen" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Bildschirm-Orientierung" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Automatisches Rotieren" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Medien-Indizierung" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Podcasts in \"Musik\" zeigen" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Auto-Flattr bei Wiedergabe" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Synchronisierung aktivieren" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "Auf gPodder.net einloggen" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Liste am Server ersetzen" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Kein Account? Registrieren" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Wiedergabeliste" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Wiedergabeliste leer" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Episoden-Details" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Episoden herunterladen" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Episoden abspielen" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Show-Notes" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Downloads auswählen" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Auswahl umkehren" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Keine Podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Füge deinen ersten Podcast hinzu." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Keine Episoden" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Berühren, um Filter zu ändern" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Episoden anzeigen" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Suchbegriff oder URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Topliste" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mein gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Beispiele" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "powered by gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Abonnieren" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s Minute" msgstr[1] "%(count)s Minuten" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s Sekunde" msgstr[1] "%(count)s Sekunden\t" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Erscheinungsdatum: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Podcast-Update von Erweiterungen angefordert." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Episoden-Download von Erweiterung angefordert." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "Ungültige URL: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "%s ist nicht abonniert." #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "%s ist bereits abonniert." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Kann %s nicht abonnieren." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s erfolgreich hinzugefügt." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Diese Konfigurations-Option existiert nicht." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Nur Blatt-Knoten der Konfiguration können gesetzt werden." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "%(old_title)s umbenannt zu %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Abonnement von %s gelöscht." #: bin/gpo:473 msgid "Updates disabled" msgstr "Updates deaktiviert" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d neue Episode" msgstr[1] "%(count)d neue Episoden" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Suche nach neuen Episoden" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Überspringe %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Feed-Update für %s deaktiviert." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Aktiviere Feed-Update von %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Horche auf ALLEN Netzwerk-Interfaces." #: bin/gpo:622 msgid "No podcasts found." msgstr "Keine Podcasts gefunden." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Index zum Abonnieren eingeben, ? für Liste" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Ungültiger Wert." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Ungültige URL: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL von %(old_url)s zu %(new_url)s geändert." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Syntax-Fehler: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "Befehl nicht eindeutig. Meinten Sie..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "Die angeforderte Funktion ist nicht verfügbar." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "Logging-Output auf die Konsole schreiben" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "die QML-basierte MeeGo 1.2 Harmattan-UI verwenden" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "Feed an der angegebenen URL abonnieren" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X Prozess-Nummer" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder Podcast Client" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast-Client" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Audio- und Video-Inhalte aus dem Web abonnieren" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr ".flv-Dateien von YouTube zu .mp4 umwandeln" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "Nützlich, um die Videos auf Abspielgeräten zu benutzen" #~ msgid "Convert FLV to MP4" #~ msgstr "FLV zu MP4 umwandeln" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "M4A-Audio zu MP3 oder OGG umwandeln" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr ".m4a-Dateien mit ffmpeg zu .mp3 oder .ogg umwandeln" #~ msgid "Convert OGG audio to MP3" #~ msgstr "OGG zu MP3 umwandeln" #~ msgid "File converted from ogg to mp3" #~ msgstr "Datei von ogg zu mp3 konvertiert" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konvertierung von ogg zu mp3 fehlgeschlagen" gpodder-3.5.2/po/el.po0000644000175000017500000023556212220345610014143 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # Konstantinos Georgokitsos , 2012. # Teo , 2011-2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Teo \n" "Language-Team: Greek (http://www.transifex.com/projects/p/gpodder/language/" "el/)\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "Το gPodder στο %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Πριν από %(count)d ημέρα" msgstr[1] "Πριν από %(count)d ημέρες" #: src/gpodder/util.py:495 msgid "Today" msgstr "Σήμερα" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Χθες" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(άγνωστο)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d δευτερόλεπτο" msgstr[1] "%(count)d δευτερόλεπτα" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d ώρα" msgstr[1] "%(count)d ώρες" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d λεπτό" msgstr[1] "%(count)d λεπτά" #: src/gpodder/util.py:1245 msgid "and" msgstr "και" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Ακυρώθηκε από το χρήστη" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Εγγραφή δεδομένων στο δίσκο" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Άνοιγμα της βάσης δεδομένων του iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "Το iPod άνοιξε" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Αποθήκευση της βάσης δεδομένων του iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Εγγραφή εκτεταμένης βάσης δεδομένων του gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Αφαίρεση του %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Προσθήκη του %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Σφάλμα κατά την αντιγραφή %(episode)s: Δεν υπάρχει αρκετός ελεύθερος χώρος " "στο %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Άνοιγμα του αναπαραγωγέα MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Ο αναπαραγωγέας MP3 άνοιξε" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Σφάλμα κατά το άνοιγμα %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Συσκευή MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Άνοιγμα της συσκευής MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "Το %s άνοιξε" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Κλείσιμο του %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "Το %s έκλεισε" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Προσθήκη του %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Προστέθηκε" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Σε αναμονή" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Συγχρονισμός" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Τελείωσε" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Απέτυχε" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Ακυρώθηκε" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Παύση" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Σφάλμα: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Προσθήκη %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Αφαίρεση %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Δεν υπάρχουν αρκετά μέσα για το Flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Το αντικείμενο δεν υπάρχει στο Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Μη έγκυρο αίτημα" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Δεν υπάρχει σύνδεση στο internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Δεν υπάρχει περιγραφή" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Δεν υπάρχει διαθέσιμη περιγραφή" #: src/gpodder/model.py:679 msgid "unknown" msgstr "άγνωστο" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Άλλο" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Βίντεο" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Ήχος" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Λάθος όνομα χρήστη/κωδικός πρόσβασης" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Λήψη" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Λείπει περιεχόμενο από τον διακομιστή" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Σφάλμα I/O: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Σφάλμα HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Ακέραιος αριθμός" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Παύση λήψης" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Δεν υπάρχει περιγραφή για αυτή την επέκταση." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Δεν βρέθηκε η εντολή: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Το python module \"%s\" δεν είναι εγκατεστημένο" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Εντολή: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Προεπιλεγμένη εφαρμογή" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Φόρτωση μη ολοκληρωμένων λήψεων" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Δεν έχει ολοκληρωθεί η λήψη ορισμένων επεισοδίων σε προηγούμενη συνεδρία." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d ατελές αρχείο" msgstr[1] "%(count)d ατελή αρχεία" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Συνέχιση όλων" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Βρέθηκαν ατελείς λήψεις από προηγούμενη συνεδρία." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Ενέργεια" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Επιβεβαίωση αλλαγών από gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Επίλεξε τις ενέργειες που θέλεις να πραγματοποιήσεις." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Μεταφόρτωση συνδρομών" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Οι συνδρομές σας μεταφορτώνονται στο διακομιστή." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Η λίστα μεταφορτώθηκε με επιτυχία." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Σφάλμα κατά τη μεταφόρτωση" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Επεισόδιο" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Μέγεθος" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Διάρκεια" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Κυκλοφόρησε" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Ορατές στήλες" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Πρόοδος" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Φόρτωση επεισοδίων" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Δεν υπάρχουν επεισόδια στην τρέχουσα προβολή" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Δεν υπάρχουν διαθέσιμα επεισόδια" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Δεν υπάρχουν podcasts σε αυτήν την προβολή" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Δεν υπάρχουν συνδρομές" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Δεν υπάρχουν ενεργές διεργασίες" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d ενεργή" msgstr[1] "%(count)d ενεργές" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "Απέτυχε %(count)d" msgstr[1] "Απέτυχαν %(count)d" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d σε αναμονή" msgstr[1] "%(count)d σε αναμονή" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "λήψη %(count)d αρχείου" msgstr[1] "λήψη %(count)d αρχείων" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "συγχρονισμός %(count)d αρχείου" msgstr[1] "συγχρονισμός %(count)d αρχείων" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Παρακαλώ ανάφερε αυτό το πρόβλημα και επανεκκίνησε το gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Εξαίρεση που δεν αντιμετωπίστηκε" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Σφάλμα στην ανάλυση της ροής: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Δεν ήταν δυνατή η λήψη κάποιων επεισοδίων:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Οι λήψεις τελείωσαν" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Αποτυχία λήψεων" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Δεν ήταν δυνατός ο συγχρονισμός ορισμένων επεισοδίων" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Ο συγχρονισμός της συσκευής ολοκληρώθηκε" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Ο συγχρονισμός της συσκευής απέτυχε" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "Ακόμα %(count)d επεισόδιο" msgstr[1] "Ακόμα %(count)d επεισόδια" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Λεπτομέρειες επεισοδίου" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Εκκίνηση λήψης τώρα" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Λήψη" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Ακύρωση" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Παύση" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Αφαίρεση από τη λίστα" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Ενημέρωση podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Άνοιγμα φακέλου λήψεων" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Σήμανση επισοδίων ως παλιά" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Αρχειοθέτηση" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Αφαίρεση podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Ρυθμίσεις του podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Σφάλμα κατά τη μετατροπή του αρχείου." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Μεταφορά αρχείου μέσω Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Προεπισκόπηση" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Αναπαραγωγή" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Αποστολή προς" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Τοπικός φάκελος" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Συσκευή Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Νέο" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Καταχωρήστε το στο Flattr" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Κατάσταση του Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Παρακαλώ ελέγξτε τις ρυθμίσεις του αναπαραγωγέα των μέσων σας στο παράθυρο " "διαλόγου των προτιμήσεων." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Σφάλμα κατά το άνοιγμα του αναπαραγωγέα" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Προσθήκη podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Παρακαλώ περίμενε ενώ γίνεται λήψη των πληροφοριών του επεισοδίου." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Οι υπάρχουσες συνδρομές παραλείφθηκαν" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Έχεις ήδη εγγραφεί σε αυτά τα podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Το Podcast απαιτεί πιστοποίηση" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Παρακαλώ συνδεθείτε στο %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Η πιστοποίηση απέτυχε" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Εντοπίστηκε ανακατεύθυνση ιστότοπου" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "Η διεύθυνση (URL) %(url)s ανακατευθύνει προς %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Θέλεις να επισκεφθείς τον ιστότοπο τώρα;" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Δεν είναι δυνατή η προσθήκη ορισμένων podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Ορισμένα podcasts δεν θα μπορούσαν να προστεθούν στη λίστα σας:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Άγνωστο" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Ανίχνευση αυτόματης εκτροπής" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Συγχώνευση ενεργειών επεισοδίου" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Οι ενέργειες επεισοδίου από το gpodder.net συγχωνεύτηκαν." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Ακύρωση..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Νέο όνομα:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Ενημέρωση %(count)d ροής..." msgstr[1] "Ενημέρωση %(count)d ροών..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Σφάλμα κατά τη διάρκεια της ενημέρωσης του %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Η ροή στο %(url)s δεν ήταν δυνατό να ενημερωθεί." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Σφάλμα κατά την ενημέρωση της ροής" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Ενημερώθηκε το %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Δεν υπάρχουν νέα επεισόδια" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Λήψη %(count)d νέου επεισοδίου." msgstr[1] "Λήψη %(count)d νέων επεισοδίων." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Νέα επεισόδια είναι διαθέσιμα" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d νέο επεισόδιο προστέθηκε στη λίστα λήψεων." msgstr[1] "%(count)d νέα επεισόδια προστέθηκαν στη λίστα λήψεων." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d νέο επεισόδιο διαθέσιμο" msgstr[1] "%(count)d νέα επεισόδια διαθέσιμα" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Έξοδος από το gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Γίνεται λήψη επεισοδίων. Μπορείς να συνεχίσεις τις λήψεις την επόμενη φορά " "που θα εκκινήσεις το gPodder. Θέλεις να το κλείσεις τώρα;" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Τα επεισόδια είναι κλειδωμέμα" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Τα επιλεγμένα επεισόδια είναι κλειδωμένα. Παρακαλώ να ξεκλειδώσεις τα " "επεισόδια που θέλεις να διαγράψεις πριν προσπαθήσεις να τα διαγράψεις." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Να διαγραφεί %(count)d επεισόδιο;" msgstr[1] "Να διαγραφούν %(count)d επεισόδια;" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Η διαγραφή των επεισοδίων αφαιρεί τα ληφθέντα αρχεία." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Διαγραφή επεισοδίων" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Παρακαλώ περίμενε ενώ τα επεισόδια διαγράφονται" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Επίλεξε παλαιότερα από %(count)d ημέρα" msgstr[1] "Επίλεξε παλαιότερα από %(count)d ημέρες" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Επιλογή αναπαραγμένου" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Επιλογή ολοκληρωμένων" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Επίλεξε τα επεισόδια που θέλεις να διαγράψεις:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Διαγραφή επεισοδίων" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Δεν έχει επιλεγεί κανένα podcast" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Παρακαλώ επιλέξτε ένα podcast από τη λίστα των podcasts για ενημέρωση." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Σφάλμα κατά τη διάρκεια της λήψης %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Σφάλμα λήψης" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Επίλεξε τα επεισόδια που θέλεις να κατεβάσεις:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Σημείωση ως παλιό" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Παρακαλώ ελέγξτε για νέα επεισόδια αργότερα." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Δεν υπάρχουν νέα επεισόδια διαθέσιμα" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Σύνδεση στο gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Παρακαλώ κάνε σύνδεση για να κατεβάσεις τις συνδρομές σου." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Συνδρομές στο gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" "Παρακαλώ επιλέξτε ένα podcast από τη λίστα των podcasts για να το " "επεξεργαστείτε." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Αφαίρεση podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Επίλεξε το podcast που θέλεις να αφαιρέσεις." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Αφαίρεση" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Αφαίρεση του podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Παρακαλώ περίμενε ενώ το podcast αφαιρείται" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Θέλεις πραγματικά να αφαιρέσεις αυτό το podcast και τα επεισόδιά του;" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Αφαίρεση των podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Παρακαλώ περίμενε ενώ τα podcasts αφαιρούνται" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Θέλεις πραγματικά να αφαιρέσεις τα επιλεγμένα podcasts και τα επεισόδιά τους;" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" "Παρακαλώ επίλεξε ένα podcast από τη λίστα των podcasts για να το αφαιρέσεις." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Αρχεία OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Εισαγωγή από OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Εισαγωγή podcasts από αρχείο OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Δεν υπάρχει τίποτα προς εξαγωγή" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Η λίστα των συνδρομών podcast είναι άδεια. Παρακαλώ εγγράψου σε κάποια " "podcasts πρώτα πριν προσπαθήσεις να εξάγεις τη λίστα των συνδρομών σου." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Εξαγωγή σε OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Εξάχθηκε %(count)d συνδρομή" msgstr[1] "Εξάχθηκαν %(count)d συνδρομές" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Ο κατάλογος των podcast σας έχει εξαχθεί με επιτυχία." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Δεν ήταν δυνατή η εξαγωγή OPML σε αρχείο. Παρακαλώ ελέγξτε τα δικαιώματα σας." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Αποτυχία εξαγωγής OPML" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Καμία διαθέσιμη ενημέρωση" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Έχετε την τελευταία έκδοση του gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Νέα διαθέσιμη έκδοση" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Εγκατεστημένη έκδοση: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Νεότερη έκδοση: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Ημερομηνία διάθεσης: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Λήψη της τελευταίας έκδοσης από το gpodder.org;" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Σχετικά με το gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Δορεά / Λίστα Επιθυμητών" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Αναφορά ενός προβλήματος" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "μεταφραστής-πιστώσεις" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Μετάφραση από τους:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Ευχαριστώ στους:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" "Παρακαλώ επιλέξτε ένα επεισόδιο από τη λίστα επεισοδίων για να εμφανιστούν " "οι σημειώσεις επεισοδίου." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Δεν επιλέχθηκε κανένα επεισόδιο" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Δεν είναι δυνατή η εκκίνηση του gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Σφάλμα D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "από το %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Ακέραιος αριθμός" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Float" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolean" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "String" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Είσοδος" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Καταχωρήθηκε στο Flattr" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "κυκλοφόρησε %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "αναπαραγμένο" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "μη αναπαραγμένο" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "σήμερα" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "έγινε λήψη %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Διαγράφηκε" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Νέο επεισόδιο" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Κατεβασμένο επεισόδιο" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Κατεβασμένο επεισόδιο-βίντεο" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Κατεβασμένη εικόνα" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Κατεβασμένο αρχείο" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "το αρχείο λείπει" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "ποτέ δεν προβλήθηκε" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "ποτέ δεν αναπαράχθηκε" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "ποτέ δεν ανοίχτηκε" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "προβλήθηκε" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "ανοίχτηκε" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "η διαγραφή εμποδίστηκε" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Όλα τα επεισόδια" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "από όλα τα podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Η συνδρομή παύθηκε" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Δεν υπάρχει τίποτα προς επικόλληση." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Το πρόχειρο είναι άδειο" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Όνομα χρήστη" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Νέος χρήστης" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Σύνδεση" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Απαιτείται πιστοποίηση" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Κωδικός πρόσβασης" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Επιλογή προορισμού" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Ρύθμιση" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Ορισμός ως" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Αδυναμία ορισμού %(field)s ως %(value)s. Απαιτείται τύπος δεδομένων: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Σφάλμα στη ρύθμιση επιλογής" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Να μη γίνει τίποτα" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Εμφάνιση της λίστας επεισοδίων" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Προσθήκη στη λίστα των λήψεων" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Λήψη αμέσως" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Κανένα" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Βασισμένο σε σύστημα αρχείων" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Σήμανση ως αναπαραγμένο" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Διαγραφή από το gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Σφάλμα" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Όνομα" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Διάρκεια" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Επεκτάσεις" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Παρακαλώ συνδεθείτε στο Flattr και Υποστηρίξτε τους Προγραμματιστές." #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Είσοδος στο Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Συνδεθήκατε ως %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Αποσύνδεση" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Η ενσωμάτωση του Flattr απαιτεί το WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "Το WebKit/Gtk δεν βρέθηκε" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Η επέκταση δεν γίνεται να ενεργοποιηθεί" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Ρύθμιση αναπαραγωγέα ήχου" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Εντολή:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Ρύθμιση αναπαραγωγέα βίντεο" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "χειροκίνητα" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "μετά από %(count)d ημέρα" msgstr[1] "μετά από %(count)d ημέρες" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Αντικαταστήστε τη λίστα συνδρομών στο διακομιστή" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Απομακρυσμένα podcasts που δεν έχουν προστεθεί τοπικά θα αφαιρεθούν από το " "διακομιστή. Θέλετε α συνεχίσετε;" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Επιλέξτε το φάκελο για το σημείο προσάρτησης" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Επιλέξτε το φάκελο για το σημείο προσάρτησης" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Αναζήτηση" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" "Η συγκεκριμένη διεύθυνση (URL) δεν παρέχει έγκυρα αντικείμενα podcast OPML." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Δε βρέθηκαν ροές" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" "Δεν υπάρχουν κανάλια YouTube, τα οποία θα ταίριαζαν με αυτό το ερώτημα." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Δε βρέθηκαν κανάλια" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Επιλογή όλων" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Αποεπιλογή όλων" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Δεν έχει γίνει καμία επιλογή" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d επεισόδιο" msgstr[1] "%(count)d επεισόδια" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "μέγεθος: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Η ροή στο %(url)s δεν ήταν δυνατό να ενημερωθεί." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Σφάλμα κατά το άνοιγμα του αναπαραγωγέα" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Προσθήκη τμήματος" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Νέο τμήμα" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Επιλέξτε νέο εξώφυλλο podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Μπορείς να αποθέσεις μία μόνο εικόνα ή διεύθυνση (URL) εδώ." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Μεταφορά και απόθεση" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" "Μπορείς να αποθέσεις μόνο τοπικά αρχεία και http:// διευθύνσεις (URLs) εδώ." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Καμία συσκευή δεν έχει ρυθμιστεί" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" "Παρακαλώ ρυθμίστε τη συσκευή σας στο παράθυρο διαλόγου των προτιμήσεων." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Αδυναμία ανοίγματος της συσκευής" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Παρακαλώ ελέγξτε τις ρυθμίσεις στο παράθυρο διαλόγου των προτιμήσεων." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Δεν έχει μείνει αρκετός χώρος στη συσκευή" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Χρειάζεται να ελευθερώσεις %s.\n" "Θέλεις να συνεχίσεις;" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Η λίστα μεταφορτώθηκε με επιτυχία." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Σφάλμα κατά τη μετατροπή του αρχείου." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Όλα" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Απόκρυψη διαγραμμένων" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Ληφθέντα" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Αρχειοθετοποιημένα" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Βίντεο" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Σήμανση ως αναπαραγμένο" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "μη αναπαραγμένη λήψη" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "(%(count)d) καταχωρήθηκαν στο Flattr " #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "μετά από %(count)d ημέρα" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Είσοδος στο Flattr από τις ρυθμίσεις." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Καταχώρηση επεισοδίου στο Flattr " #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Δεν ήταν δυνατή η σύνδεση στο Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Διαγραφή" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Μεταφόρτωση εγγραφών..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Σφάλμα κατά τη μεταφόρτωση:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Ενημέρωση όλων" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Ενημέρωση" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Μετονομασία" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Αλλαγή τμήματος" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Κατάργηση συνδρομής" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Συγχώνευση ενεργιών επισοδίων..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Συγχώνευση ενεργιών επισοδίων (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Να αφαιρεθεί το podcast και τα επεισόδιά του;" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Νέο όνομα τμήματος;" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Νέο όνομα:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Διαγραφή του επεισοδίου;" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Σήμανση ως νέο" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Επιτρέπεται η διαγραφή" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Προσθήκη στην ουρά αναπαραγωγής" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Προσθήκη podcast..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Δεν είναι δυνατή η προσθήκη ορισμένων podcasts" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Συνέχιση όλων" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Άγνωστο κομμάτι" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s στο Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Κομμάτια που δημοσιεύτηκαν από %s στο Soundcloud" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Αγαπημένα από %s στο Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Αγαπημένα κομμάτια από %s στο Soundcloud" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Μετατροπή αρχείων βίντεο σε MP4 για το Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Μετατροπή όλων των βίντεο σε μορφή συμβατή με το Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Η μετατροπή ολοκληρώθηκε" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Εμφάνιση βασικού παραθύρου" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Έξοδος" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Προβολή προόδου λήψης στο εικονίδιο του Unity Launcher." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Μετονομασία των επεισοδίων μετά τη λήψη" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Η μετατροπή απέτυχε" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Μετατροπή σε τύπο %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Η μετατροπή απέτυχε" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Αφαιρέστε τα εξώφυλλα από τα αρχεία OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "αφαιρεί τα εξώφυλλα από όλα τα αρχεία OGG" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Αφαιρέστε τα εξώφυλλα" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Έλεγχος για νέα επεισόδια κατά την εκκίνηση" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Έλεγχος για νέα επεισόδια κατά την εκκίνηση" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Όνομα αρχείου" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Ελαχιστοποίηση κατά την έναρξη" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Ελαχιστοποίηση του gPodder κατά την εκκίνηση" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Η μετατροπή απέτυχε" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Εμφάνιση \"Όλα τα επεισόδια\" στη λίστα των podcast" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ενσωμάτωση Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Προβολή προόδου λήψης στο εικονίδιο του Unity Launcher." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Προσθέστε ένα νέο podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Διεύθυνση (URL):" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Επεξεργαστής Podcast του gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Τμήμα:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Απενεργοποίηση των ενημερώσεων της ροής (παύση συνδρομής)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Γενικά" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Πιστοποίηση HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Όνομα χρήστη:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Κωδικός πρόσβασης:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Τοποθεσίες" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Λήψη στο:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Ιστότοπος:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "επιγραφή ιστότοπου" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Προχωρημένες ρυθμίσεις" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Επεξεργαστής ρυθμίσεων gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Αναζήτηση για:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Εμφάνιση όλων" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Έλεγχος για νέα επεισόδια" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Λήψη νέων επεισοδίων" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Προτιμήσεις" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Συνδρομές" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Ανακαλύψτε νέα podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Προσθήκη podcast μέσω της διεύθυνσης (URL)" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Εισαγωγή από αρχείο OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Εξαγωγή σε αρχείο OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Μετάβαση στο gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Επεισόδια" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Αναπαραγωγή" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Άνοιγμα" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Εναλλαγή κατάστασης νέου" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Αλλαγή στο κλείδωμα της διαγραφής" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Συγχρονισμός στη συσκευή" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Προβολή" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Όλα τα επισόδια\" στην λίστα των podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Χρήση τμημάτων για την λίστα των podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Γραμμή εργαλείων" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Περιγραφές επεισοδίου" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Απόκρυψη διαγραμμένων επεισοδίων" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Ληφθέντα επεισόδια" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Μη αναπαραγμένα επεισόδια" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Απόκρυψη των podcasts χωρίς επεισόδια" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Βοήθεια" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Εγχειρίδιο χρήστη" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Ενημερώσεις λογισμικού" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Φίλτρο:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Περιορισμός ταχύτητας σε" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Περιορισμός λήψεων σε" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Επιλογή επεισοδίων" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Ξεκινήστε" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Καλώς ήρθατε στο gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Η λίστα podcast είναι άδεια." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Επιλέξτε από μία λίστα με παραδείγματα podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Προσθήκη νέου podcast εισάγοντας το URL του." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Επαναφορά των συνδρομών μου από το gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Αναπαραγωγέας ήχου:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Αναπαραγωγέας βίντεο:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Επεκτάσεις" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Συγχρονίστε τις συνδρομές και τις ενέργειες επεισοδίου" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Αντικαταστήστε τη λίστα στο διακομιστή με τις τοπικές συνδρομές" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Όνομα συσκευής:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Διάστημα ενημέρωσης:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Μέγιστος αριθμός επεισοδίων ανά podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Όταν βρεθούν νέα επεισόδια:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Ενημέρωση" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Διαγραφή αναπαραγμένων επεισοδίων:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Αφαίρεση ατελείωτων επεισοδίων που παίχτικαν " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Επίσης, αφαίρεση μη αναπαραγμένων επεισοδίων" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Εκκαθάριση" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Τύπος συσκευής:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Σημείο προσάρτησης:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Μετά το συγχρονισμό ενός επεισοδίου:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Αντικατάσταση λίστας στον διακομιστή" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Άδεια λίστα αναπαραγωγής" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Συγχρονισμός μόνο των μη αναπαραγμένων επεισοδίων" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Συσκευές" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Επεξεργασία ρυθμίσεων" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Βρείτε νέα podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Επιλογή όλων" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Αποεπιλογή όλων" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Αναζήτηση" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Τα κορυφαία _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Παίζει τώρα" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Προσθήκη podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Ρυθμίσεις" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Σχετικά με" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Ευχαριστώ" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Εύσημα" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Εύσημα" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Όνομα συσκευής" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Ρυθμίσεις του gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Προσανατολισμός οθόνης" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Αυτόματη περιστροφή" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Δεν υπάρχουν podcasts σε αυτήν την προβολή" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Ενεργοποίηση συγχρονισμού" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Σύνδεση στο gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Αντικατάσταση λίστας στον διακομιστή" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Δεν έχετε λογαριασμό; Εγγραφείτε εδώ" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Αναπαραγωγή ουράς" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Άδεια λίστα αναπαραγωγής" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Λεπτομέρειες επεισοδίου" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Λήψη επεισοδίων" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Αναπαραγωγή επεισοδίων" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Σημειώσεις επεισοδίου" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Επιλογή ληφθέντων" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Αντιστρφή επιλογής" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Δεν υπάρχουν podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Προσθέστε το πρώτο σας podcast τώρα." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Δεν υπάρχουν επεισόδια" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Εμφάνιση επεισοδίων" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Αναζήτηση όρου ή URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Λιστα κοριφαίων podcast" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Το gpodder.net μου" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Παραδείγματα" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "powered by gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Συνδρομή" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s λεπτό" msgstr[1] "%(count)s λεπτά" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s δευτερόλεπτο" msgstr[1] "%(count)s δευτερόλεπτα" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "κυκλοφόρησε: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "κυκλοφόρησε: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Η ενημέρωση του podcast ζητήθηκε από τις επεκτάσεις." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Έχεις ήδη εγγραφεί σε αυτά τα podcasts:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Αδυναμία συνδρομής στο %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Αδυναμία συνδρομής στο %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "Επιτυχής προσθήκη του %s." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Αυτή η επιλογή ρύθμισης δεν υπάρχει." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Μόνο οι τερματικοί κόμβοι μπορούν να ρυθμιστούν." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Κατάργηση συνδρομής" #: bin/gpo:473 msgid "Updates disabled" msgstr "Οι ενημερώσεις απενεργοποιήθηκαν." #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d νέο επεισόδιο" msgstr[1] "%(count)d νέα επεισόδια" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Έλεγχος για νέα επεισόδια..." #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Προσθήκη podcasts" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Ανάγνωση αρχείων από το %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "Δεν βρέθηκαν podcasts." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Μη έγκυρη τιμή." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Μη έγκυρο URL: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Συντακτικό λάθος: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "Η ζητούμενη λειτουργία δεν είναι διαθέσιμη." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Εκτύπωση της εξαγόμενης αποσφαλμάτωσης στην πρότυπη έξοδο" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Εγγραφή στο " #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Αριθμός διεργασία εφαρμογής Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Πελάτης Podcast gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Πελάτης Podcast" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Εγγραφή σε περιεχόμενο ήχου και βίντεο από τον ιστό" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Μετατροπή αρχείων .flv από το Youtube σε .mp4" #~ msgid "Convert FLV to MP4" #~ msgstr "Μετατροπή FLV σε MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Μετατροπή αρχείων ήχου M4A σε MP3 ή OGG" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "Μετατροπή αρχείων ήχου M4A σε MP3 ή OGG" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Η μετατροπή ολοκληρώθηκε" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Η μετατροπή απέτυχε" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Παρακαλώ περίμενε..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Εκκίνηση του περιβάλλοντος QML του gPodder" gpodder-3.5.2/po/es.po0000644000175000017500000020745512220345607014160 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Simó Albert i Beltran , 2012. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/gpodder/language/" "es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder en %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Hace %(count)d día" msgstr[1] "Hace %(count)d días" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoy" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ayer" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(desconocido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "y" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado por el usuario" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Escribiendo datos al disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Abriendo base de datos del iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod abierto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Guardando la base de datos del iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Escribiendo base de datos extendida de gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Eliminando %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Añadiendo %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Error al copiar %(episode)s: No hay suficiente espacio en %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Abriendo reproductor MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "reproductor MP3 abierto" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Error al abrir %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Abriendo el dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s abierto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Cerrando %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s cerrado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Añadiendo %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Agregado" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Puesto en cola" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Sincronización" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Terminado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fallado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausado" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Error: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Añadir %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Eliminar %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 #, fuzzy msgid "Invalid request" msgstr "URL inválida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "No hay suscripciones" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "No hay una descripción disponible" #: src/gpodder/model.py:679 msgid "unknown" msgstr "desconocido" #: src/gpodder/model.py:744 #, fuzzy msgid "Default" msgstr "Color predeterminado" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Otro" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vídeo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Nombre de usuario/contraseña incorrectos" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Descargando" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Falta contenido en el servidor" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de Entrada/Salida: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Integración con Ubuntu Unity" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Entero" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Cancelar descarga" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "No hay descripción para esta extensión." #: src/gpodder/extensions.py:213 #, fuzzy, python-format msgid "Command not found: %(command)s" msgstr "Comando de usuario no encontrado" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python \"%s\" no instalado" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicación por defecto" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Cargando descargas incompletas" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Algunos capítulos no terminaron de bajarse en una sesión previa." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d archivo parcial" msgstr[1] "%(count)d archivos parciales" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Terminar todas" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Se encontraron descargas incompletas de una sesión anterior." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Acción" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar cambios desde gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Seleccione las acciones que desea llevar a cabo." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Subiendo suscripciones" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Tu lista de suscripciones está siendo subida al servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista subida con éxito." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Error subiendo" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Capítulo" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamaño" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duración" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Fecha de lanzamiento" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Columnas visibles" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Progreso" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Cargando capítulos" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "No hay capítulos en la vista actual" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "No hay capítulos disponibles" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "No hay podcasts en esta vista" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "No hay suscripciones" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "No hay descargas activas" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d activa" msgstr[1] "%(count)d activas" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fallida" msgstr[1] "%(count)d fallidas" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d en cola" msgstr[1] "%(count)d en cola" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "descargando %(count)d archivo" msgstr[1] "descargando %(count)d archivos" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Por favor notifique sobre este problema y reinicie gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Excepción no capturada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Error al procesar feeds RSS: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "No se pudo agregar algunas podcasts" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Descargas finalizadas" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Descargas fallidas" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "No se pudo agregar algunas podcasts" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Sincronización finalizada" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Dispositivo sincronizado" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episodio más" msgstr[1] "%(count)d episodios más" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalles del capítulo" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Comenzar descargas ahora" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Descarga" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausa" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Eliminar de la lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Actualizar podcast seleccionado" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir directorio de descarga" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar episodios como antiguos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivar" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Eliminar podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcasts" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Error al convertir archivo." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferencia de archivos por Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Previsualización" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Stream" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Carpeta local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nuevo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Por favor verifique los ajustes de su reproductor en el dialogo de " "preferencias." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Error al abrir reproductor" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Agregando podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Por favor espere mientras se descarga información del capítulo." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Subscripción existente omitida" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Ya estás suscrito a estas podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "El podcast requiere autenticación" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Por favor inicie sesión en %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Ha fallado la autenticación" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Redirección de sitio web detectada" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "La URL %(url)s redirige a %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "¿Quiere visitar el sitio web ahora?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "No se pudo agregar algunas podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Algunos podcasts no pudieron ser agregados a su lista." #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Desconocido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Redirección detectada" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Fusionando acciones de episodio" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Acciones de episodio de gpodder.net se fusionaron." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Cancelando..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nuevo nombre:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Actualizando %(count)d fuente..." msgstr[1] "Actualizando %(count)d fuentes..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Error al actualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "El RSS en %(url)s no pudo ser actualizado." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Error actualizando podcast" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Actualizado %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "No hay nuevos capítulos" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Descargando %(count)d episodio nuevo." msgstr[1] "Descargando %(count)d episodios nuevos." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nuevos capítulos disponibles" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d episodio nuevo añadido a la lista de descargas." msgstr[1] "%(count)d episodios nuevos añadidos a la lista de descargas." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nuevo episodio disponible" msgstr[1] "%(count)d nuevos episodios disponibles" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Salir de gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "Capítulos están siendo descargados." #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Los capítulos están bloqueados" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Los capítulos seleccionados están bloqueados. Por favor desbloquea los " "capítulos que quieres borrar antes de intentar borrarlos." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "¿Eliminar %(count)d episodio?" msgstr[1] "¿Eliminar %(count)d episodios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Eliminar podcasts elimina también capítulos descargados." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Borrando capítulos" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Por favor espere mientras se borran los capítulos" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Seleccionar anteriores a %(count)d día" msgstr[1] "Seleccionar anteriores a %(count)d días" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Seleccionar reproducidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Seleccionar finalizados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Seleccione los capítulos que desea eliminar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Borrar capítulos" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ningún podcast seleccionado" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Por favor, seleccione un podcast de la lista para actualizar." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Error al bajar %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Error de descarga" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Seleccione los capítulos que desea descargar:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcar como viejo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Por favor, busque nuevos capítulos más tarde." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "No hay nuevos capítulos disponibles" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Ingresar a su cuenta en gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Por favor ingrese a su cuenta para bajar sus suscripciones" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Suscripciones en gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Por favor, seleccione un podcast de la lista para editar." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Eliminar podcast" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Seleccione el podcast que desea eliminar." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Eliminar" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Eliminando podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Por favor, espere mientras se elimina el podcast" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "¿Realmente desea eliminar este podcast y sus capítulos?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Eliminando podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Por favor, espere mientras se eliminan los podcasts" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "¿Realmente desea eliminar los podcasts seleccionados y sus capítulos?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Por favor, seleccione un podcast de la lista para eliminar." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Archivos OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar de OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts de un archivo OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nada que exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Tu lista de suscripciones está vacía. Por favor suscríbete a algún podcast " "antes de exportar tu lista de suscripciones." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar a OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d suscripción exportada" msgstr[1] "%(count)d suscripciones exportadas" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Su lista de podcasts ha sido exportada de manera exitosa." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "No se puede exportar OPML a fichero. Por favor verifica tus permisos." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Fallo al exportar a OPML" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "No hay capítulos disponibles" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Nuevo capítulo disponible" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Borrando: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "publicado: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Descargar mis suscripciones desde gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Acerca de gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donar / Lista de deseos" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Informar de un problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "José Luis Fustel\n" "Silvio Sisto\n" "\n" "Launchpad Contributions:\n" " José Luis Fustel \n" " Julio Acuña \n" " Ricardo González Castro " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traducido por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Agradecimientos a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" "Por favor, seleccione un podcast de la lista para desplegar notas del " "capítulo." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "No hay capítulos seleccionados" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "No se puede iniciar gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Error D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Entero" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flotante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Cadena" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicado %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "escuchado" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "sin escuchar" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoy" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "%s descargado" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Borrar" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nuevos capítulo" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Descargar capítulo" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Descargar capítulos de video" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagen descargado" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Descargar archivo" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "archivo inexistente" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nunca reproducido" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nunca reproducido" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nunca abierto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "reproducido" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "abierto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "borrado impedido" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos los capítulos" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "de todos los podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Suscripción en pausa" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nada para pegar." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "El portapapeles está vacío" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nombre de usuario" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Usuario nuevo" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Iniciar sesión" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Requiere autenticación" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Contraseña" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Seleccione destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Configuración" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Cambiar a" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "No se puede establecer %(field)s a %(value)s. Se necesita el tipo de dato: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Error aplicando la opción" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "No hacer nada" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostrar lista de capítulos" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Agregar a lista de descarga" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Descargar inmediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ninguno" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Basado en sistema de archivos" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Marcar como no reproducido" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Borrarlo de gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Error: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Formato de cadenas personalizado." #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nombre" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duración" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configuración reproductor de sonido" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar reproductor de video" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "después de %(count)d día" msgstr[1] "después de %(count)d días" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Reemplazar lista de suscripciones en el servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcasts remotas que no han sido añadidos localmente serán eliminadas del " "servidor. ¿Continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Seleccione el directorio para punto de montaje" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Seleccione el directorio para punto de montaje" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Buscar" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "La URL especificada no provee ningún canal OPML válido." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "No se encontraron feeds RSS" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "No hay canales YouTube que concuerden con esta consulta." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "No se encontraron canales" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Seleccionar todo" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Seleccionar ninguno" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nada seleccionado" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episodio" msgstr[1] "%(count)d episodios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamaño: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "El RSS en %(url)s no pudo ser actualizado." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Error al abrir reproductor" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Acción" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nuevo nombre:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Seleccione un nuevo carátula para el podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Solo puedes soltar una sola imagen o URL aquí." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arrastrar y soltar" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Solo puedes soltar ficheros locales y URLs http:// aquí" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "No se ha configurado ningún dispositivo" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Por favor, configurar el dispositivo en el diálogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "No se puede abrir dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Por favor, compruebe la configuración en el diálogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "No hay suficiente espacio en el dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Necesista liberar %s.\n" "¿Quiere continuar?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lista subida con éxito." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Error al convertir archivo." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Todo" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ocultar eliminados" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Descargados" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archivados" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vídeos" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Marcar como no reproducido" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "Descarga no reproducida" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "luego de %d día" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "luego de %d día" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Borrando capítulos" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "No se pudo eliminar el podcast." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Borrar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Subiendo suscripciones..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Error al subir:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Actualizar todo" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Actualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renombrar" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Cambiar sección" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Suscribir" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Fusionando acciones del episodio..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Fusionando acciones del episodio (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "¿Eliminar este podcast y sus episodios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nombre de la sección nueva:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nombre nuevo:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "¿Eliminar este episodio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcar como nuevo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir borrado" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Añadir a cola de reproducción" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Añadiendo podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "No se pudo agregar algunas podcasts" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Terminar todas" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Pista desconocida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s en Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Pistas publicadas por %s en Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Favoritos de %s en Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Pistas favoritas de %s en Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "Usar conversor:" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicador de aplicación de Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Muestra un indicador de estado en la barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar ventana principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Salir" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Muestra el progreso de descarga en el icono del lanzador de Unity." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "un capítulo descargado:" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "No hay nuevos capítulos disponibles para descarga" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Convirtiendo archivo" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Convirtiendo archivo" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Eliminar de la lista" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Eliminar marca de nuevo" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Actualizar lista de capítulos al iniciar" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Actualizar lista de capítulos al iniciar" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Nombre de archivo" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Icono de estado" #: share/gpodder/extensions/gtk_statusicon.py:12 #, fuzzy msgid "Show a status icon for Gtk-based Desktops." msgstr "Muestra un indicador de estado en la barra superior." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Convirtiendo archivo" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Mostrar \"Todos los episodios\" en lista de podcasts" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integración con Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Muestra el progreso de descarga en el icono del lanzador de Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Añadir un nuevo podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor de Podcasts gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sección:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desactivar actualizaciones de fuente (pausar suscripción)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Sincronizando con reproductor" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Estrategia de borrado:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "General" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticación HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nombre de usuario:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Contraseña:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Ubicaciones" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Descargar a:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sitio Web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etiqueta del sitio web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanzado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor de configuración de gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Buscar:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostrar Todo" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Actualizar lista de capítulos" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Descargar capítulos nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencias" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Suscripciones" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Buscar nuevos podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Agregando podcast: %s" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar de OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar a OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir a gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Capítulos" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Conmutar estado nuevo" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Cambiar a:" #: share/gpodder/ui/gtk/gpodder.ui.h:26 #, fuzzy msgid "E_xtras" msgstr "Extras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Sincronizar al dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ver" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "«Todos los episodios» en la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usar secciones para la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de herramientas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Mostrar descripción del capítulo" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ocultar capítulos borrados" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Descargar capítulos nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Descargando capítulos" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "¿Eliminar el podcast y sus capítulos?" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Ayuda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual del usuario" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Fallado" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitar la velocidad de descarga a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitar el número de descargas a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Selecciona capítulos" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Configuración" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Bienvenido a gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Tu lista de suscripciones está vacía" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Seleccionar de una lista de podcasts de ejemplo" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Agregando podcast: %s" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Descargar mis suscripciones desde gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Reproductor de audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Reproductor de video:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensiones" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Descarga automática de lista de capítulos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar suscripciones y acciones de capítulos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Reemplazar lista del servidor con suscripciones locales" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nombre de Dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de actualización:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de capítulos por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Cuando se encuentran nuevos capítulos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Actualizando" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Eliminar capítulos viejos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Eliminar episodios sin finalizar aún si no se completaron" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "También eliminar capítulos no escuchados" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpieza" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Punto de montaje:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Luego de sincronizar un capítulo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Reemplazar lista en el servidor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Nombre de la lista de reproducción:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Solo sincronizar capítulos no reproducidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar configuración" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Buscar nuevos podcast" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Seleccionar todo" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Seleccionar ninguno" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Búsqueda" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Mejores _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "En reproducción" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Agregando podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Configuración" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Acerca de" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecimientos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nombre del dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Configuración de gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientación de la pantalla" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Giro automático" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "No hay podcasts en esta vista" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Continuar reproducción" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Activar sincronización" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Ingresar a su cuenta en gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Reemplazar lista en el servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "¿No tiene cuenta? Regístrese aquí" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Reproducir cola" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Nombre de la lista de reproducción:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalles del capítulo" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Descargar capítulos nuevos" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Reproducir capítulo" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notas del capítulo" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Seleccione directorio de descarga" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Prohibir borrado" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "No hay podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Añada su primer podcast ahora." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "No hay episodios" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Toque para cambiar el filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar episodios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Buscar término o URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Lista de los mejores" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mi gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Ejemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "impulsado por gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Suscribir" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "publicado: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "publicado: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Actualización del podcast solicitada por las extensiones." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Descarga del episodio solicitada por las extensiones." #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "URL inválida" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "No está suscrito a %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "No se puede suscribir a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "No se puede suscribir a %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s adicionado con éxito." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Esta opción de configuración no existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Se renombró %(old_title)s a %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Suscripción cancelada desde %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Actualizaciones desactivadas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d episodio nuevo" msgstr[1] "%(count)d episodios nuevos" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Actualizar lista de capítulos..." #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Omitiendo %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Desactivando la actualización de la fuente desde %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Activando la actualización de la fuente desde %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Escuchando en todas las interfaces de red." #: bin/gpo:622 msgid "No podcasts found." msgstr "No se encontraron podcasts." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Introduzca el indice para suscribirse, ? para la lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor no válido." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL no válida: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL cambiada de %(old_url)s a %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Error de sintaxis: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Orden ambigua. Quizá quiso decir..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "La función solicitada no está disponible." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Imprimir salida de depuración a stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Suscribirse a la URL proporcionada" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número de proceso de aplicación de Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Cliente de podcasts gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Cliente de podcasts" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Suscribirse a contenido multimedia en la web" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Usar conversor:" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Convirtiendo archivo" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Por favor, espere..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Abrir la interfaz QML de gPodder" gpodder-3.5.2/po/es_ES.po0000644000175000017500000021152312220345607014536 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Adolfo Jayme Barrientos , 2011-2013. # Marco Antonio Frias Butrón , 2012. # Simó Albert i Beltran , 2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/gpodder/" "language/es_ES/)\n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder en %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Hace %(count)d día" msgstr[1] "Hace %(count)d días" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoy" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ayer" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(desconocido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "y" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado por el usuario" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Escribiendo datos al disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Abriendo la base de datos del iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod abierto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Guardando la base de datos del iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Quitando %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Añadiendo %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Abriendo el reproductor de MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Se abrió el reproductor de MP3" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, fuzzy, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Error al actualizar %(url)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Abriendo el dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s abierto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Cerrando %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s cerrado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Añadiendo %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Añadido" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "En cola" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sincronizando" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Finalizado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fallido" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "En pausa" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Error: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Añadir %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Quitar %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "El elemento no existe en Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Solicitud no válida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "No hay conexión a Internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "No hay descripción" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Sin descripción disponible" #: src/gpodder/model.py:679 msgid "unknown" msgstr "desconocido" #: src/gpodder/model.py:744 msgid "Default" msgstr "Predeterminado" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Solo mantener los últimos" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Otros" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vídeo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Nombre de usuario/contraseña incorrecto" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Descargando" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Falta el contenido del servidor" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de E/S: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integración con el escritorio" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interfaz" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Después de la descarga" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "No hay descripción para esta extensión." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Comando no encontrado: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo Python no encontrado: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Orden: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicación predeterminada" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Cargando descargas incompletas" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Algunos episodios no se terminaron de descargar en una sesión anterior." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d archivo parcial" msgstr[1] "%(count)d archivos parciales" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Continuar todo" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Se encontraron descargas incompletas de una sesión anterior." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Acción" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar cambios de gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Seleccione las acciones que quiere realizar." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Subiendo suscripciones" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Se están subiendo sus suscripciones al servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista subida correctamente." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Error al subir" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episodio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamaño" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duración" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publicado" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Columnas visibles" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Progreso" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Cargando episodios" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "No hay episodios en la vista actual" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "No hay episodios disponibles" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "No hay podcast en esta vista" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "No hay suscripciones" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "No hay tareas activas" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d activa" msgstr[1] "%(count)d activas" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fallida" msgstr[1] "%(count)d fallidas" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d en cola" msgstr[1] "%(count)d en cola" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "descargando %(count)d archivo" msgstr[1] "descargando %(count)d archivos" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "sincronizando %(count)d archivo" msgstr[1] "sincronizando %(count)d archivos" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d tarea en la cola" msgstr[1] "%(queued)d tareas en la cola" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Informe de este problema y reinicie gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Excepción no controlada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Error del analizador de fuentes: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "No se pudieron descargar algunos episodios:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Descargas finalizadas" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Descargas fallidas" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "No se pudieron sincronizar algunos episodios:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Finalizó la sincronización del dispositivo" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Falló la sincronización del dispositivo" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episodio más" msgstr[1] "%(count)d episodios más" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalles del episodio" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Iniciar la descarga ahora" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Descargar" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausar" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Quitar de la lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Actualizar podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir la carpeta de descarga" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar episodios como antiguos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivar" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Quitar podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Configuración del podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Error al convertir el archivo." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferencia de archivo por Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Previsualización" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Stream" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Carpeta local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nuevo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Estado de Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Compruebe las opciones del reproductor de medios en el diálogo de " "preferencias." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Error al abrir el reproductor" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Añadir podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Espere mientras se descarga la información del episodio." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Suscripciones existentes omitidas" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Ya está suscrito a estos podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "El podcast requiere autenticación:" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Inicie sesión en %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Falló la autenticación" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Se detectó redirección de sitio web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "La URL %(url)s redirige a %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "¿Quiere visitar el sitio web ahora?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "No se pudieron añadir algunos podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "No se pudieron añadir algunos podcasts a su lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Desconocido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Redirección detectada" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Fusionando acciones de episodio" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Las acciones de episodio de gpodder.net están fusionadas." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Cancelando..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Conéctese a una red, e inténtelo de nuevo." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "No hay conexión de red." #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Actualizando %(count)d fuente..." msgstr[1] "Actualizando %(count)d fuentes..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Error al actualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "La fuente en %(url)s no se pudo actualizar." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Error al actualizar fuente" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s actualizados (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "No hay episodios nuevos" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Descargando %(count)d episodio nuevo." msgstr[1] "Descargando %(count)d episodios nuevos." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Episodios nuevos disponibles" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d episodio nuevo añadido a la lista de descargas." msgstr[1] "%(count)d episodios nuevos añadidos a la lista de descargas." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nuevo episodio disponible" msgstr[1] "%(count)d nuevos episodios disponibles" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Salir de gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Está descargando episodios. Puede continuar las descargas la próxima vez que " "abra gPodder. ¿Quiere salir ahora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Los episodios están bloqueados" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Los episodios seleccionados están bloqueados. Desbloquee los episodios que " "quiere eliminar antes de intentar eliminarlos." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "¿Eliminar %(count)d episodio?" msgstr[1] "¿Eliminar %(count)d episodios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "El eliminar episodios tabién quita los archivos descargados." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Eliminando episodios" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Espere mientras se eliminan los episodios" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Seleccionar anteriores a %(count)d día" msgstr[1] "Seleccionar anteriores a %(count)d días" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Seleccionar reproducidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Seleccionar finalizados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Seleccione los episodios que quiere eliminar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Eliminar episodios" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "No se seleccionó ningún podcast" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Seleccione un podcast de la lista para actualizar." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Error de descarga al descargar %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Error de descarga" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Seleccione los episodios que quiere descargar:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcar como antiguo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Busque nuevos episodios después." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "No hay episodios nuevos disponibles" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Iniciar sesión en gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Inicie sesión para descargar sus suscripciones." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Suscripciones en gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Seleccione un pocast en la lista para editar." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Quitar podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Seleccione el podcast que quiere quitar." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Quitar" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Quitando podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Espere mientras se quita el podcast" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "¿Está seguro de que quiere quitar este podcast y sus episodios?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Quitando podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Espere mientras se quitan los podcasts" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "¿Está seguro de que quiere quitar los podcasts seleccionados y sus episodios?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Seleccione un podcast en la lista para quitar." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Archivos OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar desde OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts desde un archivo OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "No hay nada que exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Su lista de suscripciones a podcasts está vacía. Suscríbase a algunos " "podcasts antes de tratar de exportar su lista de suscripciones." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar a OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d suscripción exportada" msgstr[1] "%(count)d suscripciones exportadas" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Su lista de podcast ha sido exportada correctamente." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "No se pudo exportar el archivo OPML. Verifique sus permisos." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Falló la exportación a OPML" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "No hay actualizaciones disponibles" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Usted tiene la última versión de gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nueva versión disponible" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Versión instalada: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versión más reciente: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Fecha de lanzamiento: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "¿Descargar la última versión desde gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Acerca de gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donar / Lista de deseos" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Informar de un problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Fitoschido " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traducido por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Agradecimientos a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" "Seleccione un episodio desde la lista para mostrar las notas del programa." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "No se seleccionó ningún episodio" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "No se puede iniciar gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Error de D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Entero" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flotante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Cadena" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Iniciar sesión" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicado el %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "reproducidos" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "sin reproducir" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoy" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "descargado %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Eliminado" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Episodio nuevo" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episodio descargado" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episodio de vídeo descargadp" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagen descargada" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Archivo descargado" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "archivo no encontrado" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nunca mostrado" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nunca reproducido" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nunca abierto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "mostrado" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "abierto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "eliminación impedida" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos los episodios" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "de todos los podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Suscripción pausada" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "No hay nada que pegar." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "El portapapeles está vacío." #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nombre de usuario" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Usuario nuevo" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Iniciar sesión" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Se requiere autenticación" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Contraseña" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Seleccionar destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Estableciendo" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Establecer a" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "No se puede establecer %(field)s a %(value)s. Tipo de dato necesario: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Error al establecer opción" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "No hacer nada" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostrar lista de episodios" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Añadir a la lista de descargas" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Descargar inmediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ninguno" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Basado en sistema de archivos" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Marcar como reproducido" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Eliminar de gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Error" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Personalizado (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nombre" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duración" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Inicie sesión en Flattr y apoye a los editores" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Iniciar sesión en Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Sesión iniciada como %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Cerrar sesión" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "La integración con Flattr requiere WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "No se encontró WebKit/Gtk" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "La extensión no puede ser activada" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurar reproductor de audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Orden:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar reproductor de vídeo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "después de %(count)d día" msgstr[1] "después de %(count)d días" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Reemplazar lista de suscripción en el servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Los podcasts que no se añadieron localmente se eliminarán del servidor.\n" "¿Continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Seleccione la carpeta para el punto de montaje" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Buscar" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" "La URL especificada no proporciona ningún elemento de podcast OPML válido." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "No se encontraron fuentes" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "No hay canales de YouTube que coincidan con esta consulta." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "No se encontraron canales" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Seleccionar todo" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "No seleccionar nada" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "No hay nada seleccionado" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episodio" msgstr[1] "%(count)d episodios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamaño: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "La fuente en %(url)s no se pudo actualizar." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Error al abrir el reproductor" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Añadir sección" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Sección nueva:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Seleccione el nuevo arte de portada del podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Solo puede soltar una sola imagen o URL aquí." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arrastrar y soltar" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Solo puede soltar archivos locales y URL http:// aquí." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "No hay dispositivos configurados." #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Configure su dispositivo en el diálogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "No se puede abrir el dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Compruebe la configuración en el diálogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "No queda espacio suficiente en el dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lista subida correctamente." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Error al convertir el archivo." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Todo" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ocultar eliminados" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Descargados" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archivados" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vídeos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Reproducido parcialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Descargas sin reproducir" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Inicie sesión en Flattr en la configuración." #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Eliminando episodios" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "No se pudo iniciar sesión en Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Eliminar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Subiendo suscripciones..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Error al subir:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Actualizar todo" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Actualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renombrar" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Cambiar sección" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Cancelar suscripción" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Fusionando acciones del episodio..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Fusionando acciones del episodio (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "¿Quitar este podcast y sus episodios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nombre de la sección nueva:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nombre nuevo:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "¿Eliminar este episodio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcar como nuevo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir eliminación" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Añadir a cola de reproducción" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Añadiendo podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "No se pudieron añadir algunos podcasts" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Reanudar" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Pista desconocida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s en Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Pistas publicadas por %s en Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Favoritas de %s en Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Pistas favoritas de %s en Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Descarga subtítulos .srt para los vídeos de TED Talks" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Convertir archivos de vídeo a MP4 para Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Convierte toso los vídeos a un formato compatible con Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Archivo convertido" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicador de aplicación de Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Muestra un indicador de estado en la barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar ventana principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Salir" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Muestra el progreso de descarga en el icono del lanzador de Unity." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Renombrar episodios después de la descarga" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Renombrar episodios «.» al descargar" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Conversión fallida" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Convertir archivos .m4a a .mp3 o .ogg usando ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Convertir a %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Conversión fallida" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Remover el arte de la tapa de archivos OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "remueve el arte de la tapa de todos los archivos ogg descargados" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Remover el arte de la tapa" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Encolar en reproductores de medios" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Encolar en" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Buscar episodios nuevos al inicio" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Inicia la búsqueda de episodios nuevos al inicio" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizar audio con la re-codificación" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizar el volumen de archivos de audio con normalize-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Archivo normalizado" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Icono de estado de Gtk" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Muestra un icono de estado para escritorios basados en Gtk." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizar al inicio" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiza la ventana de gPodder al inicio." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Conversión fallida" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Convertir archivos .m4a a .mp3 o .ogg usando ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Etiquetar archivos descargados usando Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Adicionar el título del episodio y podcast a las etiquetas MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integración con Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Muestra el progreso de descarga en el icono del lanzador de Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Añadir un podcast nuevo" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor de podcasts gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sección:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desactivar actualizaciones de fuente (pausar suscripción)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sincronizar con dispositivos de reproducción de MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Estrategia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "General" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticación HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nombre de usuario:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Contraseña:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Ubicación" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Descargar a:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sitio web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etiqueta del sitio web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanzado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor de configuración gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Buscar:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostrar todo" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Comprobar episodios nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Descargar episodios nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencias" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Suscripciones" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Descubrir nuevos podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Añadir podcast a través de URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar desde archivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar a archivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir a gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Conmutar estado nuevo" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Cambiar bloqueo de eliminación" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizar al dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ver" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "«Todos los episodios» en la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usar secciones para la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de herramientas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descripciones de episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ocultar episodios eliminados" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episodios descargados" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episodios sin reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ocultar podcasts sin episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Ay_uda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual de usuario" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Actualizaciones de software" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitar la velocidad de descarga a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitar descargas a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Seleccionar episodios" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Primeros pasos" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Bienvenido a gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Su lista de podcast está vacía." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Elija de una lista de podcasts de ejemplo" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Adicionar un podcast introduciendo su URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Restaurar mis suscripciones desde gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Reproductor de audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Reproductor de vídeo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Formato de vídeo preferido:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensiones" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar suscripciones y acciones de episodio" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Reemplazar lista en el servidor con suscripciones locales" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nombre de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de actualización:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de episodios por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Cuando se encuentren episodios nuevos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Actualizando" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Eliminar episodios reproducidos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Quitar episodios sin finalizar aún si no se completaron" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "También quitar episodios sin reproducir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpieza" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Punto de montaje:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Después de sincronizar un episodio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Reemplazar lista en el servidor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Lista de reproducción vacía" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Solo sincronizar episodios sin reproducir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar config." #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Encontrar nuevos podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Seleccionar todo" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "No seleccionar nada" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Búsqueda" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Mejores _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "En reproducción" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Añadir podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Configuración" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Acerca de" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecimientos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nombre del dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Configuración de gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientación de la pantalla" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Giro automático" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indización de medios" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Mostrar podcasts en la aplicación Música" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Activar sincronización" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Iniciar sesión en gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Reemplazar lista en el servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "¿No tiene cuenta? Regístrese aquí" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Reproducir cola" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Lista de reproducción vacía" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalles del episodio" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Descargar episodios" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Reproducir episodios" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notas del programa" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Seleccionar los descargados" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Invertir selección" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "No hay podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Añada su primer podcast ahora." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "No hay episodios" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Toque para cambiar el filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar episodios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Buscar término o URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Lista de los mejores" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mi gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Ejemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "impulsado por gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Suscribirse" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Fecha de lanzamiento: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Actualización del podcast solicitada por las extensiones." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Descarga del episodio solicitada por las extensiones." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "URL no válida: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "No está suscrito a %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "No se puede suscribir a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "No se puede suscribir a %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s adicionado con éxito." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Esta opción de configuración no existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Sólo se puede establecer la configuración de los nodos hoja." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Se renombró %(old_title)s a %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Suscripción cancelada desde %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Actualizaciones desactivadas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d episodio nuevo" msgstr[1] "%(count)d episodios nuevos" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Comprobando episodios nuevos" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Omitiendo %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Desactivando la actualización de la fuente desde %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Activando la actualización de la fuente desde %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Escuchando en todas las interfaces de red." #: bin/gpo:622 msgid "No podcasts found." msgstr "No se encontraron podcasts." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Introduzca el indice para suscribirse, ? para la lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor no válido." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL no válida: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL cambiada de %(old_url)s a %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Error de sintaxis: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Orden ambigua. Quizá quiso decir..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "La función solicitada no está disponible." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Imprimir salida de depuración a stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Suscribirse a la URL proporcionada" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número de proceso de aplicación de Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Cliente de podcasts gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Cliente de podcasts" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Suscribirse a contenido multimedia en la web" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Convertir archivos .flv de YouTube a .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Útil para reproducir vídeos descargados en reproductores de sobremesa" #~ msgid "Convert FLV to MP4" #~ msgstr "Convertir FLV a MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Convertir audio M4A a MP3 o OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Convertir archivos .m4a a .mp3 o .ogg usando ffmpeg" #~ msgid "Convert OGG audio to MP3" #~ msgstr "Convertir sonido OGG a MP3" #~ msgid "File converted from ogg to mp3" #~ msgstr "Se convirtió el archivo de ogg a mp3" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Falló la conversión de ogg a mp3" gpodder-3.5.2/po/es_MX.po0000644000175000017500000021235312220345607014555 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Rigoberto Calleja , 2012-2013. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-04-14 13:46-0600\n" "Last-Translator: Rigoberto Calleja \n" "Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/gpodder/" "language/es_MX/)\n" "Language: es_MX\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder en %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Hace %(count)d día" msgstr[1] "Hace %(count)d días" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoy" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ayer" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(desconocido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "y" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado por el usuario" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Escribiendo datos al disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Abriendo base de datos de iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod abierto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Guardando base de datos de iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Escribiendo base de datos extendida gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Eliminando %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Agregando %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Error al copiar %(episode)s: No hay suficiente espacio en %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Abriendo reproductor MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Reproductor MP3 abierto" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Error al abrir %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Abriendo el dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s abierto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Cerrando %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s cerrado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Agregando %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Agregado" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "En espera" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sincronizando" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Terminado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Falló" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "En pausa" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Error: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Agregar %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Eliminar %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "No hay fondos suficientes donar vía Flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "El elemento no existe en Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Ya había donado vía Flattr o usted es dueño del elemento" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Petición inválida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "No hay conexión a la Internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Sin descripción" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "No hay descripción disponible" #: src/gpodder/model.py:679 msgid "unknown" msgstr "desconocido" #: src/gpodder/model.py:744 msgid "Default" msgstr "Por defecto" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Conservar únicamente el más reciente" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Otro" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Usuario y/o contraseña incorrectos" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Descargando" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Falta el contenido del servidor" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Error de E/S: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Error HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integración con el escritorio" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interfaz" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Post-descarga" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "No hay descripción para esta extensión." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Comando no encontrado: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" "Se requiere al menos uno de los siguientes comandos: %(list_of_commands)s" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "El siguiente módulo de Python no fue encontrado: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicación por defecto" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Cargando descargas incompletas" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Algunos episodios no se terminaron de descargar en una sesión anterior." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d archivo parcial" msgstr[1] "%(count)d archivos parciales" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Reanudar todos" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Se encontraron descargas incompletas de una sesión anterior." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Acción" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar los cambios desde gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Seleccione las acciones que desea realizar." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Cargando suscripciones" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Se están transfiriendo sus suscripciones al servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista transferida correctamente." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Error de transferencia" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episodio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamaño" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duración" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publicado" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Columnas visibles" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Avance" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Cargando episodios" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "No hay episodios en la vista actual" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "No hay episodios disponibles" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "No hay podcasts en esta vista" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "No hay suscripciones" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "No hay tareas activas" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d activa" msgstr[1] "%(count)d activas" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fallido" msgstr[1] "%(count)d fallidos" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d en espera" msgstr[1] "%(count)d en espera" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "descargando %(count)d archivo" msgstr[1] "descargando %(count)d archivos" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "sincronizando %(count)d archivo" msgstr[1] "sincronizando %(count)d archivos" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d tarea en espera" msgstr[1] "%(queued)d tareas en espera" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Reporte este problema y reinicie gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Excepción no manejada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Error del analizador sintático de fuentes: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "No fue posible descargar algunos episodios:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Descargas finalizadas" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Las descargas fallaron" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "No fue posible sincronizar algunos episodios:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Se concluyó la sincronización del dispositivo" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "La sincronización del dispositivo falló" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episodio más" msgstr[1] "%(count)d episodios más" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalles del episodio" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Iniciar descarga" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Descargar" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Poner en pausa" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Eliminar de la lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Actualizar podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir carpeta de descarga" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar episodios como antiguos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivar" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Eliminar podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Configuración del podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Error al convertir archivo." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferencia de archivo vía Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Vista previa" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Stream" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Carpeta local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nuevos" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Donar via Flattr" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Estado de Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Compruebe la configuración de su reproductor multimedia en las preferencias." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Error al abrir el reproductor" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Agregando podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Espere mientras se descarga la información del episodio." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Las suscripciones existentes fueron omitidas" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Ya está suscrito a estos podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "El podcast requiere autenticación" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Inicie sesión en %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "La autenticación falló" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Se detectó redirección del sitio Web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "La URL %(url)s redirige a %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "¿Quiere visitar el sitio web ahora?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "No se pudieron agregar algunos podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "No se pudieron agregar algunos podcasts a su lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Desconocido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Redirección detectada" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Combinando acciones del episodio" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Las acciones de los episodios de gpodder.net se combinaron" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Cancelando..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Por favor conéctese a una red e intente nuevamente." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "No hay conexión de red" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Actualizando %(count)d fuente..." msgstr[1] "Actualizando %(count)d fuentes..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Error al actualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "La fuente en %(url)s no se pudo actualizar." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Error al actualizar la fuente" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s actualizados (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "No hay episodios nuevos" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Descargando %(count)d episodio nuevo." msgstr[1] "Descargando %(count)d episodios nuevos." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Hay episodios nuevos disponibles" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d episodio nuevo fue agregado a la lista de descargas." msgstr[1] "" "%(count)d episodios nuevos fueron agregados a la lista de descargas." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nuevo episodio disponible" msgstr[1] "%(count)d nuevos episodios disponibles" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Salir de gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Está descargando episodios. Puede reanudar las descargas la próxima vez que " "inicie gPodder.¿Quiere salir ahora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Los episodios están bloqueados" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Los episodios seleccionados están bloqueados. Desbloquee los episodios que " "desea eliminar." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "¿Eliminar %(count)d episodio?" msgstr[1] "¿Eliminar %(count)d episodios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Al eliminar episodios se borran los archivos descargados." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Eliminando episodios" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Espere mientras se eliminan los episodios" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Seleccionar anteriores a %(count)d día" msgstr[1] "Seleccionar anteriores a %(count)d días" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Seleccionar reproducidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Seleccionar finalizados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Seleccione los episodios que desea eliminar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Eliminar episodios" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "No se seleccionó ningún podcast" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Seleccione un podcast de la lista para actualizar." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Error al descargar %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Error de descarga" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Seleccione los episodios que desea descargar:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcar como antiguo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Busque nuevos episodios más tarde." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "No hay episodios nuevos disponibles" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Iniciar sesión en gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Inicie sesión para descargar sus suscripciones." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Suscripciones en gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Para editar, seleccione un podcast de la lista." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Eliminar podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Seleccione el podcast que desea eliminar." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Eliminar" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Eliminando podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Espere mientras se elimina el podcast" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "¿Realmente quiere eliminar este podcast y sus episodios?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Eliminando podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Espere mientras los podcasts se eliminan" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "¿Realmente quiere eliminar los podcasts seleccionados y sus episodios?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Seleccione un podcast de la lista para eliminar." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Archivos OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar desde OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts desde un archivo OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "No hay nada que exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Su lista de suscripciones está vacía. Suscríbase a algún podcast antes de " "exportarla." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar a OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d suscripción exportada" msgstr[1] "%(count)d suscripciones exportadas" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Su lista de podcasts se exportó correctamente." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "No se pudo exportar el archivo OPML. Verifique sus permisos." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Falló la exportación a OPML" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "No hay actualizaciones disponibles" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Usted tiene la última versión de gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nueva versión disponible" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Versión instalada: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versión más reciente: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Fecha de publicación: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "¿Desea descargar la versión mas reciente desde gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Acerca de gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donar / Lista de regalos" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Informar de un problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Rigoberto Calleja \n" " " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traducido por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Agradecimientos a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Seleccione un episodio de la lista para mostrar las notas." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "No se seleccionó ningún episodio" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "No se puede iniciar gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Error de D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Entero" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Número de punto flotante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Cadena" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Ingresar" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Donación vía Flattr realizada" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicado el %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "reproducidos" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "sin reproducir" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoy" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "%s descargado" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Eliminados" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Episodio nuevo" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episodio descargado" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episodio de video descargado" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagen descargada" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Archivo descargado" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "archivo no encontrado" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nunca mostrado" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nunca reproducido" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nunca abierto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "mostrado" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "abierto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "se evitó la eliminación" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos los episodios" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "de todos los podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Suscripción en pausa" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "No hay nada que pegar." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "El portapapeles está vacío" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nombre de usuario" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Usuario nuevo" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Iniciar sesión" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Se requiere autenticación" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Contraseña" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Seleccionar destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Configuración" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Establecer a" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "No se puede establecer %(field)s a %(value)s. Se requiere el tipo de dato: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Error al establecer opción" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "No hacer nada" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostrar lista de episodios" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Agregar a la lista de descargas" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Descargar inmediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ninguna" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Basada en el sistema de archivos" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Marcar como reproducido" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Eliminar de gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Error" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Personalizado (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nombre" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duración" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Por favor ingrese a Flattr y apoye a los autores" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Ingresar a Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Usted ha ingresado como %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Cerrar sesión" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "La integración con Flattr requiere WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "No se encontró WebKit/Gtk" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "La extensión no pudo ser activada" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Información del módulo de extensiones" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurar reproductor de audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar reproductor de video" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "después de %(count)d día" msgstr[1] "después de %(count)d días" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Reemplazar la lista de suscripciones en el servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Los podcasts remotos que no han sido agregados localmente serán eliminados " "del servidor.¿Desea continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Seleccione una carpeta como punto de montaje" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "Seleccione una carpeta para las listas de reproducción" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Buscar" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" "La URL especificada no proporciona ningún elemento de podcast OPML válido." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "No se encontraron fuentes" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "No hay canales de YouTube que coincidan con la consulta." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "No se encontraron canales" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Seleccionar todo" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "No seleccionar nada" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "No hay nada seleccionado" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episodio" msgstr[1] "%(count)d episodios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamaño: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "No se pudo crear la carpeta %s." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "Error al escribir la lista de reproducción" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Agregar sección" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nueva sección:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Seleccionar nueva portada del podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Solamente puede soltar una imagen o URL aquí." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arrastrar y soltar" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Solamente puede soltar archivos locales y URLs http:// aquí." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "No se ha configurado ningún dispositivo" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" "Por favor configure su dispositivo en la caja de dialogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "No fue posible abrir el dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Por favor verifique la configuración en las preferencias." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "No hay espacio suficiente disponible en el dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Se requieren: %(required_space)s de espacio libre disponible\n" "¿Desea continuar?" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "La actualización fue exitosa" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "La lista de reproducción en su reproductor MP3 ha sido actualizada." #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "Los episodios han sido eliminados del dispositivo" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "Error al escribir los archivos de la lista de reproducción" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Todos" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ocultar eliminados" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Descargados" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archivados" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Videos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Reproducidos parcialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Descargados y no reproducidos" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Donaciones a Flattr (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Donar via Flattr (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Ingrese a Flattr a través de la configuración." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Donando vía Flattr..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "No fue posible ingresar a Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Eliminar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Transfiriendo suscripciones..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Error al transferir:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Actualizar todos" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Actualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renombrar" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Cambiar sección" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Cancelar suscripción" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Fusionando acciones del episodio..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Fusionando acciones del episodio (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "¿Eliminar este podcast y sus episodios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nuevo nombre de la sección:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nuevo nombre:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "¿Eliminar este episodio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcar como nuevo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir eliminación" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Agregar a lista de reproducción" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Agregando podcasts..." #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "No fue posible agregar algunos podcasts:" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Continuar" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Canción desconocida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s en SoundCloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Canciones publicadas en SoundCloud por %s." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Favoritas de %s en SoundCloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Canciones favoritas de %s en SoundCloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Herramienta para descargar subtítulos de conferencias TED" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Descargar subtítulos '.srt' para los videos de las conferencias TED" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Convertir archivos de video de MP4 a Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Convierte todos los videos a un formato compatible con Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Archivo convertido" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicador de aplicación de Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Muestra un indicador de estado en la barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar ventana principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Salir" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "Mostrar el avance de la descarga en la barra de tareas" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "Mostrar el avance en la barra de tareas de Windows." #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Renombrar episodios despues de descargarlos" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Renombrar episodios a \".\" al descargarlos" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "Convertir archivos de video" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "Convertir archivos de video a avi/mp4/m4v" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Convertir a %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "La conversión falló" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Eliminar portada de los archivos OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Elimina portada de todos los archivos OGG" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Eliminar portada" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Poner en lista de espera de los reproductores de medios" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Agregar elemento al menú de contexto para poner en la lista de espera de los " "reproductores de medios instalados" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Poner en lista de espera" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Buscar nuevos episodios al iniciar" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Inicia la búsqueda de nuevos episodios al iniciar" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizar audio a través de una recodificación" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" "Normalizar el volumen de los archivos de audio a través de normalize-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Archivo normalizado" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Ícono de estado de Gtk" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Mostrar un ícono de estado en los escritorios basados en Gtk" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "Enviar vía 'stream' a Sonos" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "Enviar podcasts vía 'stream' a bocinas Sonos" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizar al iniciar" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiza la ventana de gPodder al iniciar." #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "Convertir archivos de audio" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "Convertir archivos de audio a mp3/ogg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Etiquetar los archivos descargados empleando Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Agregar títulos del podcast y episodio a las etiquetas MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integración con Unity de Ubuntu" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Mostrar el avance de la descarga en el ícono del lanzador de Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Agregar nuevo podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor de Podcast gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sección:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desactivar actualizaciones de fuente (poner suscripción en pausa)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sincronizar a dispositivos reproductores de MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Estrategia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "General" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticación HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nombre de usuario:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Contraseña:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Ubicaciones" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Descargar a:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sitio Web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etiqueta del sitio web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanzado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor de configuración de gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Buscar:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostrar Todos" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Buscar episodios nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Descargar episodios nuevos" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencias" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Suscripciones" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Descubrir nuevos podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Agregar podcast vía URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar desde archivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar a archivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir a gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Cambiar estado de nuevo" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Cambiar bloqueo de eliminación" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizar al dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ver" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Todos los episodios\" en la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usar secciones para la lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de herramientas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descripciones de los episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ocultar episodios eliminados" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episodios descargados" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episodios sin reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ocultar podcasts sin episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Ay_uda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual de usuario" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Actualizaciones de software" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitar velocidad de descarga a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitar descargas a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Seleccionar episodios" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Para empezar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Bienvenido a gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Su lista de podcasts está vacía." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Elija de una lista de ejemplos de podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Agregar podcast escribiendo su URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Restaurar mis suscripciones desde gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Reproductor de audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Reproductor de video:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Formato de video preferido:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensiones" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Donar automáticamente via Flattr al reproducir episodios" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar suscripciones y acciones del episodio" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Reemplazar lista del servidor con suscripciones locales" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nombre del dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de actualización:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de episodios por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Cuando se encuentren episodios nuevos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Actualizando" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Eliminar episodios reproducidos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Eliminar episodios reproducidos aunque no se hayan completado" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Eliminar también episodios sin reproducir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpieza" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Punto de montaje:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Después de sincronizar un episodio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "Crear lista de reproducción en dispositivo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "Carpeta de listas de reproducción:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" "Eliminar de gPodder aquellos episodios que sean borrados del dispositivo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Sincronizar únicamente los episodios que no han sido reproducidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar configuración" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Buscar nuevos podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Seleccionar todos" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "No seleccionar ninguno" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Búsqueda" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Mejores _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Reproducción en curso" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "Agregar un podcast" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Configuración" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Acerca de" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecimientos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "Ingresar a gPodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "Credenciales" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nombre del dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Configuración de gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientación de la pantalla" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Giro automático" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Índice de medios" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Mostrar podcasts en el reproductor de música" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Donar automáticamente via Flattr al reproducir" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Activar sincronización" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "Ingresar a gPodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Reemplazar lista en el servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "¿No tiene cuenta? Regístrese aquí" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Lista de reproducción" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "La lista de reproducción está vacía" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalles del episodio" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Descargar episodios" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Reproducir episodios" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notas" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Seleccionar descargados" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Invertir selección" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "No hay podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Agregue su primer podcast ahora." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "No hay episodios" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Toque para cambiar el filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar episodios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Buscar término o URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Los mejores" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mi gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Ejemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "funciona gracias a gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Suscribir" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "Baje para actualizar" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "Suelte para actualizar" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Actualización de podcast solicitada por las extensiones." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Descarga de episodio solicitada por las extensiones." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "URL inválido: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "No está suscrito a %s." #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "Ya está suscrito a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "No se puede suscribir a %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s fue agregado exitosamente." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Esta opción de configuración no existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Solamente se pueden establecer nodos-hoja de configuración." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Se renombró %(old_title)s a %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Suscripción cancelada desde %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Actualizaciones desactivadas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d episodio nuevo" msgstr[1] "%(count)d episodios nuevos" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Verificando si existen nuevos episodios" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Omitiendo %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Desactivando la actualización de la fuente desde %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Activando la actualización de la fuente desde %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Escuchando en TODAS las interfaces de red." #: bin/gpo:622 msgid "No podcasts found." msgstr "No se encontraron podcasts." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Introduzca el índice para suscribirse, ? para la lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor no válido." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL no válida: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "La URL fue cambiada de %(old_url)s a %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Error de sintaxis: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "Comando ambiguo. ¿Quiso decir...." #: bin/gpo:828 msgid "The requested function is not available." msgstr "La función solicitada no está disponible." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "mostrar bitácora en la consola" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "emplear la interfaz de usuario basada en QML de MeeGo 1.2" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "suscribir a la fuente desde un URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número de proceso de aplicación de Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Cliente de Podcasts gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Cliente de podcasts" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Suscribirse a contenido multimedia de la Web" #~ msgid "Privacy policy" #~ msgstr "Aviso de privacidad" gpodder-3.5.2/po/eu.po0000644000175000017500000021115112220345607014146 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Asier Iturralde Sarasola , 2011-2013. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-23 00:23+0000\n" "Last-Translator: Asier Iturralde Sarasola \n" "Language-Team: Basque (http://www.transifex.com/projects/p/gpodder/language/" "eu/)\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder %s-n" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Duela egun %(count)d" msgstr[1] "Duela %(count)d egun" #: src/gpodder/util.py:495 msgid "Today" msgstr "Gaur" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Atzo" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(ezezaguna)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "Segundu %(count)d" msgstr[1] "%(count)d segundu" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "Ordu %(count)d" msgstr[1] "%(count)d ordu" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "Minutu %(count)d" msgstr[1] "%(count)d minutu" #: src/gpodder/util.py:1245 msgid "and" msgstr "eta" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Erabiltzaileak ezeztatua" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Datuak diskora idazten" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "iPod datu-basea irekitzen" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod irekita" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "iPod datu-basea gordetzen" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Hedatutako gtkpod datu-basea idazten" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "%s kentzen" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "%s gehitzen" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Errorea %(episode)s kopiatzean: Ez dago behar adina leku libre " "%(mountpoint)s-(e)n" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "MP3 erreproduzitzailea irekitzen" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 erreproduzitzailea irekita" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Errorea %(filename)s irekitzean: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP gailua" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "MTP gailua irekitzen" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s irekita" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "%s ixten" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s itxita" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "%s gehitzen..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Gehituta" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Ilaran" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sinkronizatzen" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Amaituta" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Huts egin du" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Bertan behera utzita" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausarazita" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Errorea: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Gehitu %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Ezabatu %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Elementua ez da existitzen Flattr-en" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Baliogabeko eskaera" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Interneteko konexiorik ez" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Deskribapenik ez" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Ez dago deskribapenik eskuragarri" #: src/gpodder/model.py:679 msgid "unknown" msgstr "ezezaguna" #: src/gpodder/model.py:744 msgid "Default" msgstr "Lehenetsia" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Mantendu azkena soilik" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Bestelakoak" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Bideoa" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audioa" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Erabiltzaile-izen/pasahitz okerra" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Deskargatzen" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Edukia ez dago zerbitzarian" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Errorea: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP Errorea %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Ubuntu Unity Integrazioa" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interfazea" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Hautatu erreproduzitutakoak" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Deskribapenik ez hedapen honentzat" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Ez da komandoa aurkitu: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Ez da Python modulua aurkitu: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Komandoa: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplikazio lehenetsia" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Osatu gabeko deskargak kargatzen" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Zenbait atal osatu gabe gelditu ziren aurreko saio batean." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "Fitxategi %(count)d osatu gabe" msgstr[1] "%(count)d fitxategi osatu gabe" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Berrekin guztiak" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Aurreko saio bateko osatu gabeko deskargak aurkitu dira." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Ekintza" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Berretsi gpodder.net-eko aldaketak" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Hautatu burutu nahi dituzun ekintzak." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Harpidetzak igotzen" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Zure harpidetzak zerbitzarira igotzen ari dira." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Zerrenda behar bezala igo da." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Errorea igotzean" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Atala" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamaina" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Iraupena" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Argitalpen-data" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Ageriko zutabeak" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Aurrerapena" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Atalak kargatzen" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Ez dago atalik uneko ikuspegian" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Ez dago atalik eskuragarri" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Ez dago podcast-ik ikuspegi honetan" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Ez dago harpidetzarik" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Ataza aktiborik ez" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktibo" msgstr[1] "%(count)d aktibo" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d-ek huts egin du" msgstr[1] "%(count)d-(e)k huts egin dute" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d ilaran" msgstr[1] "%(count)d ilaran" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "Fitxategi %(count)d deskargatzen" msgstr[1] "%(count)d fitxategi deskargatzen" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "Fitxategi %(count)d sinkronizatzen" msgstr[1] "%(count)d fitxategi sinkronizatzen" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "Ataza %(queued)d ilaratuta" msgstr[1] "%(queued)d ataza ilaratuta" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Mesedez jakinarazi arazo hau eta gPodder berrabiarazi:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Kudeatu gabeko salbuespena" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Jario-analizatzaile errorea: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Ezin izan dira zenbait atal deskargatu:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Amaitutako deskargak" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Huts egindako deskargak" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Ezin izan dira zenbait atal sinkronizatu:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Gailua sinkronizatzea amaituta" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Gailua sinkronizatzeak huts egin du" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "Atal %(count)d gehiago" msgstr[1] "%(count)d atal gehiago" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Atalaren xehetasunak" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Hasi deskarga orain" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Deskarga" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Utzi" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausarazi" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Ezabatu zerrendatik" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Eguneratu podcast-a" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Ireki deskargen karpeta" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Markatu atalak zahar bezala" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Artxiboa" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Ezabatu podcast-a" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast ezarpenak" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Errorea fitxategia bihurtzean." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth fitxategi-transferentzia" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Aurrebista" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Korrontea" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Bidali honi" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Karpeta lokala" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth gailua" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Berria" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Flattr egoera" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Mesedez egiaztatu zure erreproduzitzailearen ezarpenak hobespenak " "elkarrizketa-koadroan." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Errorea erreproduzitzailea irekitzean" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Podcast-ak gehitzen" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Mesedez itxaron atalaren informazioa deskargatu bitartean." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Existitzen diren harpidetzak ekidin dira" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Dagoeneko harpidetuta zaude honako podcast-etara:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast-ak autorizazioa eskatzen du" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Mesedez hasi saioa %s-n:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autentifikazioak huts egin du" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Webgune birbidalketa detektatu da" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "%(url)s URL-ak %(target)s-era birbidaltzen du." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Webgunea orain bistarazi nahi duzu?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Zenbait podcast ezin izan dira gehitu" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Zenbait podcast ez dira zure zerrendara gehituko:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Ezezaguna" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Birbidalketa detektatu da" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Atal-ekintzak batzen" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "gpodder.net-eko atal-ekintzak batu dira" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Bertan behera uzten..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Mesedez konektatu sare batetara, ondoren saiatu berriro." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Sareko konexiorik ez" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Jario %(count)d eguneratzen..." msgstr[1] "%(count)d jario eguneratzen..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Errorea %(url)s eguneratzean: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "%(url)s-eko jarioa ezin izan da eguneratu." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Errorea jarioa eguneratzean" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s (%(position)d/%(total)d) eguneratuta" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Ez dago atal berririk" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Atal berri %(count)d deskargatzen." msgstr[1] "%(count)d atal berri deskargatzen." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Atal berriak eskuragarri" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "Atal berri %(count)d gehitu da deskarga-zerrendara." msgstr[1] "%(count)d atal berri gehitu dira deskarga-zerrendara." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "Atal berri %(count)d eskuragarri" msgstr[1] "%(count)d atal berri eskuragarri" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Irten gPodder-etik" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Atalak deskargatzen ari zara. Deskargak berrekin ditzakezu gPodder " "abiarazten duzun hurrengo aldian. Aplikazioa itxi nahi duzu orain?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Atalak blokeatuta daude" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Hautatutako atalak blokeatuta daude. Mesedez desblokeatu ezabatu nahi " "dituzun atalak." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Ezabatu atal %(count)d?" msgstr[1] "Ezabatu %(count)d atal?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Atalak ezabatzeak deskargatutako fitxategiak ezabatzen ditu." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Atalak ezabatzen" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Mesedez itxaron atalak ezabatu arte" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Hautatu egun %(count)d baino zaharragoak" msgstr[1] "Hautatu %(count)d egun baino zaharragoak" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Hautatu erreproduzitutakoak" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Hautatu bukatutakoak" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Hautatu ezabatu nahi dituzun atalak:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Ezabatu atalak" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ez da podcast-ik hautatu" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Mesedez hautatu podcast-zerrendatik eguneratu nahi duzun podcast-a." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Deskarga errorea %(episode)s deskargatzean: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Deskarga errorea" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Hautatu deskargatu nahi dituzun atalak:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Markatu zahar bezala" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Mesedez egiaztatu beranduago atal berririk badagoen." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Ez dago atal berririk eskuragarri" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Saioa hasi gpodder.net-en" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Mesedez saioa hasi harpidetzak deskargatzeko." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "gpodder.net-eko harpidetzak" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Mesedez hautatu podcast-zerrendako podcast bat editatzeko." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Ezabatu podcast-ak" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Hautatu ezabatu nahi duzun podcast-a." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Ezabatu" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Podcast-a ezabatzen" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Mesedez itxaron podcast-a ezabatu bitartean" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Ziur zaude podcast hau eta bere atal guztiak ezabatu nahi dituzula?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Podcast-ak ezabatzen" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Mesedez itxaron podcast-ak ezabatu bitartean" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Ziur zaude hautatutako podcast-ak eta beren atal guztiak ezabatu nahi " "dituzula?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Mesedez hautatu zerrendatik ezabatu nahi duzun podcast-a." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML fitxategiak" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Inportatu OPML-tik" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Inportatu podcast-ak OPML fitxategitik" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Ez dago esportatzeko ezer" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Zure podcast harpidetza-zerrenda hutsik dago. Mesedez harpidetu zenbait " "podcast-etara harpidetza-zerrenda esportatzen saiatu aurretik." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Esportatu OPML-ra" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Harpidetza %(count)d esportatuta" msgstr[1] "%(count)d harpidetza esportatuta" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Zure podcast zerrenda behar bezala esportatu da." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" " Ezin izan da OPML fitxategira esportatu. Mesedez egiaztatu zure baimenak." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML esportazioak huts egin du" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Ez dago eguneraketarik eskuragarri" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "gPodder-en azken bertsioa daukazu." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Bertsio berria eskuragarri" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Instalatutako bertsioa: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Bertsio berriena: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Argitalpen data: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Azken bertsioa deskargatu gpodder.org-etik?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "gPodder-i buruz" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Dohaintza egin / Nahien zerrenda" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Arazoak jakinarazi" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Asier Iturralde Sarasola" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Itzultzailea:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Eskerrak:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Mesedez hautatu atal bat atal-zerrendatik oharrak bistaratzeko." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Ez da hautatu atalik" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Ezin izan da gPodder abiarazi" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus errorea: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "%s-tik" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Zenbaki osoa" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Koma mugikorreko zenbakia" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolearra" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Katea" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Hasi saioa" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "%s-n argitaratua" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "erreproduzitua" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "erreproduzitu gabea" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "gaur" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "%s deskargatua" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Ezabatua" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Atal berria" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Deskargatutako atala" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Deskargatutako bideo-atala" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Deskargatutako irudia" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Deskargatutako fitxategia" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "fitxategia falta da" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "inoiz bistarazi gabea" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "inoiz erreproduzitu gabea" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "inoiz ireki gabea" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "bistaratua" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "irekia" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "ezabaketa galarazita" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Atal guztiak" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "podcast guztietakoak" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Harpidetza pausarazita" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Ez dago zer itsatsirik." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Arbela hutsik dago" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Erabiltzaile-izena" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Erabiltzaile berria" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Saioa hasi" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autentifikazioa beharrezkoa da" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Pasahitza" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Hautatu helburua" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Ezarpena" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Ezarri hona" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Ezin izan da %(field)s-n %(value)s ezarri. Beharrezko datu mota: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Errorea aukera ezartzean" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Ez egin ezer" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Bistaratu atal zerrenda" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Gehitu deskarga zerrendara" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Deskargatu berehala" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Bat ere ez" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Fitxategi-sisteman oinarritua" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Markatu erreproduzituta bezala" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Ezabatu gPodder-etik" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Errorea" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Pertsonalizatua (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Izena" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Iraupena" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Hedapen moduluaren informazioa" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Mesedez hasi saioa Flattr-en eta babestu argitaratzaileak" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Hasi saioa Flattr-en" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "%(username)s bezala saioa hasita" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Amaitu saioa" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Flattr integraziorako WebKit/Gtk behar da." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "Ez da WebKit/Gtk aurkitu" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Ezin da hedapena aktibatu" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Hedapen moduluaren informazioa" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Konfiguratu audio erreproduzitzailea" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Komandoa:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Konfiguratu bideo erreproduzitzailea" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "eskuz" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "egun %(count)d geroago" msgstr[1] "%(count)d egun geroago" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Ordezkatu zerbitzariko harpidetza zerrenda" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "Lokalean gehitu ez diren urruneko podcast-ak ezabatuko dira. Jarraitu?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Hautatu karpeta muntaketa-punturako" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Hautatu karpeta muntaketa-punturako" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Bilatu" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Zehaztutako URL-an ez dago baliozko OPML podcast elementurik." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Ez da jariorik aurkitu" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Ez dago kontsultarekin bat datorren YouTube-ko kanalik." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Ez da kanalik aurkitu" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Hautatu guztiak" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Bat ere ez hautatu" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ez dago ezer hautatuta" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "Atal %(count)d" msgstr[1] "%(count)d atal" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamaina: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "%(url)s-eko jarioa ezin izan da eguneratu." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Errorea erreproduzitzailea irekitzean" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Gehitu saila" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Sail berria:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Hautatu podcast-aren azal berria" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Irudi edo URL bakarra jaregin dezakezu hemen." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arrastatu eta jaregin" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Fitxategi lokal eta http:// URL-ak soilik jaregin ditzazkezu hemen." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Gailurik ez konfiguratuta" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Mesedez konfiguratu zure gailua hobespenak elkarrizketa-koadroan." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Ezin da gailua ireki" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Mesedez egiaztatu ezarpenak hobespenak elkarrizketa-koadroan." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Ez dago leku libre nahikorik gailuan" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Leku libre gehiago behar da: %(required_space)s\n" "Jarraitu nahi duzu?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Zerrenda behar bezala igo da." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Errorea fitxategia bihurtzean." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Guztiak" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ezkutatu ezabatuak" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Deskargatuta" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Artxibatuta" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Bideoak" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Erdizka erreproduzituta" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Erreproduzitu gabeko deskargak" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "egun %(count)d geroago" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "egun %(count)d geroago" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Hasi saioa Flattr-en ezarpenetan." #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Atalak ezabatzen" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Ezin izan da saioa hasi Flattr-en." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Ezabatu" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Harpidetzak igotzen..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Errorea igotzean:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Eguneratu dena" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Eguneratu" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Berrizendatu" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Aldatu saila" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Harpidetza kendu" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Atal-ekintzak batzen..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Atal-ekintzak batzen (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Ezabatu podcast hau eta bere atalak?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Sail berriaren izena:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Izen berria:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Ezabatu atal hau?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Markatu berri bezala" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Baimendu ezabaketa" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Gehitu erreprodukzio-zerrendara" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Podcast-ak gehitzen..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Zenbait podcast ezin izan dira gehitu" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Berrekin" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Pista ezezaguna" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s Soundcloud-en" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "%s-k Soundcloud-en argitaratutako pistak." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s-ren gogokoak Soundcloud-en" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "%s-k Soundcloud-en gustoko dituen pistak." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "TED Talks-entzako azpitituluen deskargatzailea" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "TED Talks bideoentzako .srt azpitituluak deskargatzen ditu" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Bihurtu bideo fitxategiak Rockbox-entzako MP4-ra" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Rockbox-ekin bateragarria den formatura bihurtzen ditu bideo guztiak" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Fitxategia bihurtuta" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu Aplikazio Adierazlea" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Egoera-adierazle bat erakusten du goiko barran." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Erakutsi leiho nagusia" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Irten" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Erakutsi deskargen aurrerapena Unity Abiarazlearen ikonoan." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Berrizendatu atalak deskargatu ondoren" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" "Berrizendatu atalak deskargatzean honela: \".\"" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Bihurketak huts egin du" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Transkodetu .m4a fitxategiak .mp3 edo .ogg-era ffmpeg erabiliz" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Bihurtu %(format)s-(e)ra" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Bihurketak huts egin du" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Kendu azalak OGG fitxategietatik" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "azalak kentzen ditu deskargatutako ogg fitxategi guztietatik" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Kendu azalak" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Bilatu atal berriak abioan" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Atal berrien bilaketa hasten du abiaraztean" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizatu audioa berkodetzearekin" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizatu audio fitxategien bolumena normalize-audio-rekin" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Fitxategia normalizatuta" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Gtk egoera-ikonoa" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Erakutsi egoera-ikono bat Gtk-n oinarritutako mahaigainetan." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizatu abioan" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "gPodder leihoa minimizatzen du abioan" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Bihurketak huts egin du" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Transkodetu .m4a fitxategiak .mp3 edo .ogg-era ffmpeg erabiliz" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Etiketatu deskargatutako fitxategiak Mutagen-ekin" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Gehitu atal eta podcast-aren izenburuak MP3/OGG etiketei" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ubuntu Unity Integrazioa" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Erakutsi deskargen aurrerapena Unity Abiarazlearen ikonoan." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Gehitu podcast berri bat" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder Podcast Editorea" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Saila:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desgaitu jario eguneraketak (harpidetza pausarazi)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sinkronizatu MP3 gailuekin" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Estrategia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Orokorra" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP Autentifikazioa" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Erabiltzaile-izena:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Pasahitza:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Kokalekuak" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Deskargatu hona:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Webgunea:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "webgune etiketa" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Aurreratua" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder Konfigurazio Editorea" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Bilatu hau:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Bistaratu guztiak" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcast-ak" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Egiaztatu atal berririk badagoen" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Deskargatu atal berriak" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Hobespenak" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Harpidetzak" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Aurkitu podcast berriak" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Gehitu podcast-a URL bidez" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Inportatu OPML fitxategitik" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Esportatu OPML fitxategira" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Joan gpodder.net-era" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Atalak" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Erreproduzitu" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Ireki" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Txandakatu egoera berria" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Aldatu ezabaketa blokeoa" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "_Gehigarriak" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sinkronizatu gailua" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ikusi" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "Podcast zerrendako \"Atal guztiak\"" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Erabili sailak podcast zerrendan" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Tresna-barra" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Atalen deskribapenak" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ezkutatu ezabatutako atalak" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Deskargatutako atalak" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Erreproduzitu gabeko atalak" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ezkutatu atalik gabeko podcast-ak" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Laguntza" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Erabiltzaile-gida" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Software eguneraketak" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Iragazkia:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcast-ak" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Mugatu deskarga-abiadura:" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Mugatu deskarga-kopurua:" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Hautatu atalak" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Lehen pausoak" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Ongietorri gPodder-era" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Zure podcast zerrenda hutsik dago." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Hautatu adibidetarako podcast zerrendatik" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Gehitu podcast bat bere URL-a sartuz" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Leheneratu nire harpidetzak gpodder.net-etik" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Audio erreproduzitzailea:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Bideo erreproduzitzailea:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Bideo-formatu hobetsia:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Hedapenak" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sinkronizatu harpidetzak eta atal-ekintzak" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Ordezkatu zerbitzariko zerrenda harpidetza lokalekin" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Gailuaren izena:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Eguneraketa maiztasuna:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Atal kopuru maximoa podcast-eko:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Atal berriak aurkitzean:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Eguneratzen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Ezabatu erreproduzitutako atalak:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Ezabatu erreproduzitutako atalak bukatu gabe badaude ere" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Ezabatu baita erreproduzitu gabeko atalak" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Garbitu" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Gailu mota:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Muntaketa-puntua:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Atal bat sinkronizatu ondoren:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Ordezkatu zerbitzariko zerrenda" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Erreprodukzio-zerrenda hutsik" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Sinkronizatu soilik erreproduzitu gabeko atalak" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Gailuak" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editatu konfigurazioa" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Aurkitu podcast berriak" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Hautatu guztiak" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Ez hautatu ezer" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Bilatu" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "_Podcast gorenak" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Orain erreproduzitzen" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Podcast-ak gehitzen" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Ezarpenak" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Honi buruz" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Eskerrak" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Kredituak" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Kredituak" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Gailuaren izena" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "gPodder ezarpenak" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Pantailaren orientazioa" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Biraketa automatikoa" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Edukiak indexatzen" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Erakutsi podcast-ak Musika aplikazioan" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Gaitu sinkronizazioa" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Saioa hasi gpodder.net-en" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Ordezkatu zerbitzariko zerrenda" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Konturik ez daukazu? Erregistratu hemen" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Erreprodukzio-zerrenda" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Erreprodukzio-zerrenda hutsik" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Atalaren xehetasunak" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Deskargatu atalak" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Erreproduzitu atalak" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Atalaren oharrak" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Hautatu deskargatutakoak" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Alderantzikatu hautapena" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Podcast-ik ez." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Gehitu zure lehen podcast-a orain." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Atalik ez" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Ukitu iragazkia aldatzeko" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Erakutsi atalak" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Bilatu terminoa edo URLa" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Top zerrenda" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Nire gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Adibideak" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "gpodder.net-en oinarritua" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Harpidetu" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "Minutu %(count)s" msgstr[1] "%(count)s minutu" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "Segundo %(count)s" msgstr[1] "%(count)s segundo" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "Tira behera freskatzeko" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "Askatu freskatzeko" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Hedapenek eskatutako podcast eguneraketa." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Hedapenek eskatutako atalen deskarga." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "url baliogabea: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Ez zaude %s-(e)ra harpidetuta" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Ezin da harpidetu %s-(e)ra" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Ezin da harpidetu %s-(e)ra" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "Behar bezala gehitu da %s." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Konfigurazio aukera hau ez da existitzen." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Orri konfigurazio nodoak soilik ezarri daitezke." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "%(old_title)s berrizendatuta %(new_title)s bezala." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "%s-(e)tik harpidetza kenduta." #: bin/gpo:473 msgid "Updates disabled" msgstr "Eguneraketak desgaituta" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "Atal berri %(count)d" msgstr[1] "%(count)d atal berri" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Atal berrien bila" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "%(podcast)s saltatzen" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "%s-(e)ko jario eguneraketa desgaitzen." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "%s-(e)ko jario eguneraketa gaitzen." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Sareko interfaze GUZTIETAN entzuten." #: bin/gpo:622 msgid "No podcasts found." msgstr "Ez da podcast-ik aurkitu." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Sartu indizea harpidetzeko, ? zerrendarako" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Baliogabeko balioa." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL baliogabea: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL-a aldatu da %(old_url)s-(e)tik %(new_url)s-(e)ra." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Sintaxi errorea: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Zalantzazko komandoa. Hau esan nahi al zenuen..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "Eskatutako funtzioa ez dago eskuragarri." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Inprimatu arazketa irteera stdout-era" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Harpidetu zehaztutako URL-ra" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X aplikazio prozesu zenbakia" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder Podcast Bezeroa" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast Bezeroa" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Harpidetu sareko audio eta bideo edukira" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Bihurtu YouTube-ko .flv fitxategiak .mp4-ra" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Baliagarria deskargatutako bideoak hardware gailuetan erreproduzitzeko" #~ msgid "Convert FLV to MP4" #~ msgstr "Bihurtu FLV MP4-ra" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Bihurtu M4A audioa MP3 edo OGG-ra" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Transkodetu .m4a fitxategiak .mp3 edo .ogg-era ffmpeg erabiliz" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "Bihurtu M4A audioa MP3 edo OGG-ra" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Fitxategia bihurtuta" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Bihurketak huts egin du" #~ msgid "OK" #~ msgstr "Ados" #~ msgid "Please wait..." #~ msgstr "Itxaron mesedez..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Abiarazi gPodder-en QML interfazea" gpodder-3.5.2/po/fa_IR.po0000644000175000017500000015425712220345610014524 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Mohammad Dashtizadeh , 2012. # Mohammadreza Abdollahzadeh , 2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/gpodder/" "language/fa_IR/)\n" "Language: fa_IR\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "امروز" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "دیروز" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(نامعلوم)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "و" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "اضافه شد" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "در صف قرار گرفت" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "اتمام یافته" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "نا موفق" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "لغو شده" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "متوقف شده" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "خطا: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "افزودن %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "حذف %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "هیچ توضیحی مهیا نیست" #: src/gpodder/model.py:679 msgid "unknown" msgstr "ناشناخه" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "دیگر" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "ویدئو" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "صوت" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "نام کاربری/گذر واژه اشتباه" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "در حال دانلود" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "عدد صحیح" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "برنامه پیشفرض" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "جی پادر" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "بار گذاری دانلودهای ناکامل" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "از سرگیری همه" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "عمل" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "لیست بارگذاری‌های موفق" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "خطا در بارگذاری" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "قسمت" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "اندازه" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "مدت" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "انتشار" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "بارگیری به اتمام رسید" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "عملیات بارگیری شکست خورد" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "شروع بارگیری" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "بارگیری" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "لغو" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "وقفه" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "بروزرسانی پادکست" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "آرشیو" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "حذف پادکست" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "خطا در تبدیل پرونده." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "پیش نمایش" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "جریان" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "ارسال به" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "پوشه محلی" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "وسیله بلوتوس" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "جدید" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "افزودن پادکستها" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "عدم موفقیت در احراز حویت" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "نا شناخته" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "هیچ قسمت جدیدی وجود ندارد" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "قسمت جدید موجود است" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "خروج از جی پادر" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "قسمتها قفل شده اند" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "عدد صحیح" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "عدد اعشاری" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "بولی" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "رشته حروف" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "امروز" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "مدت" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "خطا در بارگذاری" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "لیست بارگذاری‌های موفق" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "خطا در تبدیل پرونده." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "بار گذاری دانلودهای ناکامل" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "از سرگیری همه" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "افزودن پادکستها" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 msgid "Episode added to playlist" msgstr "" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" gpodder-3.5.2/po/fi.po0000644000175000017500000020311512220345607014134 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: LANGUAGE \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder koneella %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d päivä sitten" msgstr[1] "%(count)d päivää sitten" #: src/gpodder/util.py:495 msgid "Today" msgstr "Tänään" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Eilen" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(tuntematon)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekunti" msgstr[1] "%(count)d sekuntia" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d tunti" msgstr[1] "%(count)d tuntia" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuutti" msgstr[1] "%(count)d minuuttia" #: src/gpodder/util.py:1245 msgid "and" msgstr "ja" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Käyttäjän peruma" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Kirjoitetaan tietoja levylle" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Avataan iPodin tietokantaa" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod avattu" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Tallennetaan iPodin tietokanta" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Kirjoitetaan gtkpodin tietokantaa" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Poistetaan %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Lisätään %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Virhe kopioitaessa jaksoa %(episode)s: Liitospisteessä %(mountpoint)s ei ole " "riittävästi vapaata tilaa" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Avataan MP3-soitinta" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3-soitin avattu" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Virhe avattaessa tiedostoa %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-laite" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Avataan MTP-medialaitetta" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "Laite %s on avattu" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Suljetaan laitetta %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "Laite %s on suljettu" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Lisätään jaksoa %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Lisätty" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Jonossa" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synkronointi" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Valmis" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Epäonnistui" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Peruttu" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Tauolla" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Virhe: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Lisää %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Poista %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 #, fuzzy msgid "Invalid request" msgstr "Virheellinen URL" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Ei tilauksia" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Kuvausta ei ole saatavilla" #: src/gpodder/model.py:679 msgid "unknown" msgstr "tuntematon" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Muu" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Virheellinen käyttäjätunnus tai salasana" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Ladataan" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Palvelimelta puuttuu sisältöä" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Siirräntävirhe: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-virhe: %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Kokonaisluku" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Pysäytä lataus" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Kuvausta ei ole saatavilla." #: src/gpodder/extensions.py:213 #, fuzzy, python-format msgid "Command not found: %(command)s" msgstr "Käyttäjän komentoa ei löytynyt" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python-moduulia ”%s” ei ole asennettu" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Komento: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Oletussovellus" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Ladataan keskeneräiset lataukset" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Joidenkin jaksojen lataaminen jäi kesken aiemmalla käyttökerralla." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d keskeneräinen tiedosto" msgstr[1] "%(count)d keskeneräistä tiedostoa" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Jatka kaikkien latausta" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Löydettiin keskeneräisiä latauksia aiemmasta käyttökerrasta." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Toiminto" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Vahvista muutokset gpodder.netistä" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Valitse toiminnot, jotka haluat suorittaa." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Ladataan tilaukset palvelimelle" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Tilauksia ladataan palvelimelle." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Luettelon lähettäminen onnistui." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Virhe lähetettäessä palvelimelle" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Jakso" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Koko" #: src/gpodder/gtkui/main.py:828 #, fuzzy msgid "Duration" msgstr "Otsikko:" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Julkaistu" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Edistyminen" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Ladataan jaksoja" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Nykyisessä näkymässä ei ole yhtään jaksoa" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Yhtään jaksoa ei ole saatavilla" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Tässä näkymässä ei ole yhtään podcastia" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Ei tilauksia" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Ei aktiivisia latauksia" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktiivinen" msgstr[1] "%(count)d aktiivista" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d epäonnistunut" msgstr[1] "%(count)d epäonnistunutta" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d jonossa" msgstr[1] "%(count)d jonossa" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "ladataan %(count)d tiedosto" msgstr[1] "ladataan %(count)d tiedostoa" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Tee ilmoitus tästä ongelmasta ja käynnistä gPodder uudelleen:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Käsittelemätön poikkeus" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Syötejäsentimen virhe: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Joitakin podcasteja ei voitu lisätä" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Lataukset ovat valmiita" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Lataukset epäonnistuivat" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Joitakin podcasteja ei voitu lisätä" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Synkronointi on valmis." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Laite on synkronoitu" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d toinen jakso" msgstr[1] "%(count)d muuta jaksoa" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Jakson tiedot" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Aloita lataaminen nyt" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Lataa" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Peru" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Tauko" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Poista luettelosta" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Päivitä podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Avaa latauskansio" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Merkitse jakso soitetuksi" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Poista podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast-asetukset" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Virhe tiedoston muuntamisessa." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth-tiedostonsiirto" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Virta" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Lähetä" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Paikalliseen kansioon" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth-laitteelle" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Uusi" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Tarkista mediasoitinasetukset asetusikkunasta." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Virhe soittimen avaamisessa" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Lisätään podcasteja" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Odota, jaksotietoja ladataan." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Nykyiset tilaukset ohitettiin" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Nämä podcastit on jo tilattu:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast vaatii tunnistautumisen" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Kirjaudu kohteeseen %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Tunnistautuminen epäonnistui" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Verkkosivun uudelleenohjaus on tunnistettu" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL %(url)s ohjaa kohteeseen %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Haluatko vierailla verkkosivulla nyt?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Joitakin podcasteja ei voitu lisätä" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Joitakin podcasteja ei voitu lisätä luetteloon:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Tuntematon" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Uudelleenohjaus tunnistettiin" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Yhdistetään jaksotoimintoja" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Jaksotoimintoja yhdistetään gpodder.netistä." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Perutaan..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Uusi nimi:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Päivitetään %(count)d syöte..." msgstr[1] "Päivitetään %(count)d syötettä..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Virhe päivitettäessä %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Osoitteessa %(url)s olevaa syötettä ei voitu päivittää." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Virhe päivitettäessä syötettä" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Päivitettiin %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Ei uusia jaksoja" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Ladataan %(count)d uusi jakso." msgstr[1] "Ladataan %(count)d uutta jaksoa." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Uusia jaksoja on saatavilla" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d uusi jakso on lisätty latausluetteloon." msgstr[1] "%(count)d uutta jaksoa on lisätty latausluetteloon." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d uusi jakso on saatavilla" msgstr[1] "%(count)d uutta jaksoa on saatavilla" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Lopeta gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Jaksojen lataaminen on kesken. Lataamista voidaan jatkaa, kun gPodder " "käynnistetään seuraavan kerran. Haluatko lopettaa nyt?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Jaksot on lukittu" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Valitut jaksot on lukittu eikä niitä voi poistaa ennen kuin lukitukset " "poistetaan." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Poistetaanko %(count)d jakso?" msgstr[1] "Poistetaanko %(count)d jaksoa?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Valitse laitteelta poistettavat jaksot." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Poistetaan jaksoja" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Odota, jaksot poistetaan" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Valitse %(count)d päivää vanhemmat" msgstr[1] "Valitse %(count)d päivää vanhemmat" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Valitse soitetut" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Valitse valmiit" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Valitse jaksot, jotka haluat poistaa:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Poista jaksot" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Mitään podcastia ei ole valittu" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Valitse päivitettävä podcast luettelosta." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Virhe ladattaessa jaksoa %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Latausvirhe" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Valitse ladattavat jaksot:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Merkitse vanhaksi" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Etsi uusia jaksoja myöhemmin." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Uusia jaksoja ei ole saatavilla" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Kirjaudu gpodder.net-osoitteeseen" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Kirjaudu tilauksien lataamiseksi." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "gpodder.net-palvelun tilaukset" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Valitse muokattava jakso podcast-luettelosta." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Poista podcasteja" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Valitse podcastit, jotka haluat poistaa." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Poista" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Poistetaan podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Odota, podcastia poistetaan" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Haluatko poistaa tämän podcastin ja sen jaksot?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Poistetaan podcasteja" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Odota, podcasteja poistetaan" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Haluatko poistaa valitut podcastit ja niiden jaksot?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Valitse poistettava podcast luettelosta." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML-tiedostot" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Tuo OPML-tiedostosta" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Tuo podcastit OPML-tiedostosta" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Ei mitään vietävää" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Podcast-tilauksien luettelo on tyhjä. Tilaa joitakin podcasteja ennen kuin " "yrität viedä tilausluetteloa." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Vie OPML:ksi" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Vietiin %(count)d tilaus" msgstr[1] "Vietiin %(count)d tilausta" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Podcast-luettelon vienti onnistui." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Ei voitu viedä OPML-tiedostoksi. Tarkista tiedosto-oikeudet." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML-vienti epäonnistui" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Yhtään jaksoa ei ole saatavilla" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Uusia jaksoja on saatavilla" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Poistetaan: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "julkaistu: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Lataa tilaukset gpodder.netistä" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Lopeta gPodder" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Amazon-toiveluettelo" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Raportoi ongelmasta" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Ville-Pekka Vainio, 2009-2010" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Valitse luettelosta jakso, jonka jaksotiedot näytetään." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Mitään jaksoa ei ole valittu" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "gPodderia ei voi käynnistää" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus-virhe: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "kanavalta %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Kokonaisluku" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Liukuluku" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Totuusarvo" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Merkkijono" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "julkaistu %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "soitettu" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "soittamaton" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "tänään" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "ladattu %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Poistettu" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Uusi jakso" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Ladattu jakso" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Ladattu videojakso" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Ladattu kuva" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Ladattu tiedosto" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "puuttuva tiedosto" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "ei koskaan näytetty" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "ei koskaan soitettu" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "ei koskaan avattu" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "näytetty" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "avattu" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "poistaminen on estetty" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Kaikki jaksot" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "kaikista podcasteista" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Tilaus on keskeytetty" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Ei mitään liitettävää." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Leikepöytä on tyhjä" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Käyttäjätunnus" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Uusi käyttäjä" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Kirjautuminen" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Tunnistautuminen vaaditaan" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Salasana" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Valitse kohde" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Asetus" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Asetettu arvoon" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Asetusta %(field)s ei voida asettaa arvoon %(value)s. Tarvittava " "tietotyyppi: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Virhe tehtäessä asetusta" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Älä tee mitään" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Näytä jaksoluettelo" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Lisää latausluetteloon" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Lataa heti" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ei mitään" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Tiedostojärjestelmäpohjainen" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Merkitse soittamattomaksi" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Poista gPodderista" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Virhe: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Mukautetut muotomerkkijonot" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Otsikko:" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Lataa heti" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommentti:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Videosoittimen asetukset" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuaalisesti" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "%(count)d päivän jälkeen" msgstr[1] "%(count)d päivän jälkeen" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Korvaa palvelimella oleva tilausluettelo" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Palvelimelta poistetaan podcastit, joita ei ole lisätty paikalliseen " "gPodderiin. Jatketaanko?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Valitse liitospisteenä käytettävä kansio" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Valitse liitospisteenä käytettävä kansio" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Etsi" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Annetussa osoitteessa ei ole yhtään OPML-podcastia." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Syötteitä ei löytynyt" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Mikään YouTube-kanava ei vastaa tätä hakua." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Asemia ei löytynyt" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Valitse kaikki" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Tyhjennä valinta" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Mitään ei ole valittu" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d jakso" msgstr[1] "%(count)d jaksoa" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "koko: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Osoitteessa %(url)s olevaa syötettä ei voitu päivittää." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Virhe soittimen avaamisessa" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Toiminto" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Uusi nimi:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Valitse uusi podcastin kansi" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Tähän voi pudottaa vain yhden kuvan tai osoitteen." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Vedä ja pudota" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Tähän voi pudottaa vain paikallisia tiedostoja ja http://-osoitteita." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Laitetta ei ole asetettu" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Tee mediasoitinasetukset asetusikkunassa." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Laitetta ei voi avata" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Tarkista asetukset asetusikkunasta." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Laitteella ei ole riittävästi vapaata tilaa" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Tilaa on vapautettava %s.\n" "Haluatko jatkaa?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Luettelon lähettäminen onnistui." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Virhe tiedoston muuntamisessa." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Kaikki" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Piilota poistetut jaksot" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Ladattu" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Kaikki jaksot" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Merkitse soittamattomaksi" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "soittamaton lataus" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "%(count)d päivän jälkeen" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "%(count)d päivän jälkeen" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Poistetaan jaksoja" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Podcastia ei voitu poistaa." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Poista" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Ladataan tilaukset palvelimelle" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Virhe lähetettäessä palvelimelle" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Päivitä kaikki" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Päivitä kaikki" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Nimeä uudelleen" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Käänteinen valinta" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Peru tilaus" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Yhdistetään jaksotoimintoja" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Yhdistetään jaksotoimintoja" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Poistetaanko podcast ja sen jaksot?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Uusi nimi:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Uusi nimi: %s" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Poista jaksot" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Merkitse uudeksi" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Salli poistaminen" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Musiikkisoitin:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Lisätään podcasteja" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Joitakin podcasteja ei voitu lisätä" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Jatka kaikkien latausta" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Tuntematon kappale" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "Käyttäjätunnus %s Soundcloudissa" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Käyttäjän %s julkaisemat kappaleet Soundcloudissa." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Käyttäjän %s suosikit Soundcloudissa" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Käyttäjän %s suosikit Soundcloudissa." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "iPodien OGG-muunnin" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Lopeta" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "yksi jakso ladattu:" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Yksi uusi jakso on saatavilla" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Muunnetaan tiedostoa" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Muunnetaan tiedostoa" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Aseta kansikuva tiedostosta" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Poista uusi merkki" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Etsi uusia jaksoja käynnistettäessä" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Etsi uusia jaksoja käynnistettäessä" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Tiedostonimi" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Tilakuvake" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Muunnetaan tiedostoa" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Näytä ”Kaikki jaksot” podcast-luettelossa" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Lisää uusi podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Osoite:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodderin podcast-muokkain" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 #, fuzzy msgid "Section:" msgstr "Toiminto" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Poista syötteiden päivitysheuristiikat käytöstä (katkaise tilaus)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synkronoidaan soittimelle" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Poistostrategia" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Yleinen" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP-tunnistautuminen" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Käyttäjätunnus:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Salasana:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Sijainnit" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Lataa kohteeseen:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Verkkosivu:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "verkkosivun nimi" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Lisäasetukset" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodderin asetusten muokkain" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Etsi:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Näytä kaikki" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcastit" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Etsi uusia jaksoja" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Lataa uudet jaksot" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Ominaisuudet" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Tilaukset" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Etsi uusia podcasteja" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Lisää podcast osoitteesta" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Tuo OPML-tiedostosta" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Vie OPML-tiedostoon" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Mene gpodder.net-osoitteeseen" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Jaksot" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Toista" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Avaa" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Muuta poistolukkoa" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Synkronoi laitteelle" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Näytä" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Näytä ”Kaikki jaksot” podcast-luettelossa" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Virhe podcast-luettelon tallentamisessa" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Näytä työkalurivi" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Jaksokuvaukset" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Piilota poistetut jaksot" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Ladatut jaksot" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Soittamattomat jaksot" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Piilota podcastit, joilla ei ole jaksoja" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "O_hje" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Käyttöohje" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Suodin:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcastit" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Rajoita latausnopeus:" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Rajoita latauksien määrä:" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Valitse jaksot" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Asetukset" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Tervetuloa gPodderiin" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Tilausluettelo on tyhjä." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Valitse esimerkkipodcastien luettelosta" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Lisää podcast osoitteesta" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Lataa tilaukset gpodder.netistä" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Musiikkisoitin:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Videosoitin:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Lataa uudet jaksot aina automaattisesti" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synkronoi tilaukset ja jaksotoiminnot" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Korvaa palvelimella oleva luettelo paikallisilla tilauksilla" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Laitteen nimi:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Päivitysväli:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Suurin jaksojen määrä / podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Kun uusia jaksoja on löydetty:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Päivitys" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Poista soitetut jaksot:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Poista soitetut jaksot laitteelta" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Poista myös soittamattomat jaksot" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Siivous" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Laitteen tyyppi:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Liitospiste:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Jakson synkronoinnin jälkeen:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Korvaa palvelimella oleva tilausluettelo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Soittolistan nimi:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Synkronoi vain soittamattomat jaksot" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Laitteet" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Muokkaa asetuksia" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Etsi uusia podcasteja" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Valitse kaikki" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Poista valinnat" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Haku" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Kuunnelluimmat _podcastit" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Lisätään podcasteja" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Asetukset" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Tietoja" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Laitteen nimi:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "gpodder.net-asetukset" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Näytön suunta" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Automaattinen siivous" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Tässä näkymässä ei ole yhtään podcastia" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Jatka soittoa" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Synkronoinnin jälkeen:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Kirjaudu gpodder.net-osoitteeseen" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Korvaa palvelimella oleva tilausluettelo" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Soitettu" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Soittolistan nimi:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Jakson tiedot" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Ladatut jaksot" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Soita jakso" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Jaksotiedot" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Valitse lataushakemisto" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Käänteinen valinta" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Ei podcasteja" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Ei uusia jaksoja" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Näytä jaksoluettelo" #: share/gpodder/ui/qml/Subscribe.qml:53 #, fuzzy msgid "Search term or URL" msgstr "Etsi:" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "Esimerkkipodcastit" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Mene gpodder.net-osoitteeseen" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Tilaa" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "julkaistu: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "julkaistu: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Podcast vaatii tunnistautumisen" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Virheellinen URL" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Nämä podcastit on jo tilattu:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Ei voi synkronoida iPodiin" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Ei voi synkronoida iPodiin" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Peru tilaus" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Päivitä valitut" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d uusi jakso" msgstr[1] "%(count)d uutta jaksoa" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Etsitään uusia jaksoja..." #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Ohitetaan podcast: %s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Luetaan tiedostoja hakemistosta %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Podcasteja ei löytynyt" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 #, fuzzy msgid "Invalid value." msgstr "Virheellinen URL" #: bin/gpo:671 #, fuzzy, python-format msgid "Invalid URL: %s" msgstr "Virheellinen URL" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Tämä ominaisuus ei ole käytettävissä iPodeilla." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Tulosta vianjäljitystietoja vakiotulosteeseen" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Tilaa kanava osoitteesta" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "gPodderin podcast-muokkain" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Podcast-luettelo" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "iPodien OGG-muunnin" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Muunnetaan tiedostoa" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Odota hetki..." gpodder-3.5.2/po/fr.po0000644000175000017500000020541412220345607014151 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. # Ludovic LACOSTE , 2011. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: French (http://www.transifex.com/projects/p/gpodder/language/" "fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder sur %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "il y a %(count)d jour" msgstr[1] "il y a %(count)d jours" #: src/gpodder/util.py:495 msgid "Today" msgstr "Aujourd'hui" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Hier" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(inconnu)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d seconde" msgstr[1] "%(count)d secondes" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d heure" msgstr[1] "%(count)d heures" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minute" msgstr[1] "%(count)d minutes" #: src/gpodder/util.py:1245 msgid "and" msgstr "et" #: src/gpodder/sync.py:195 #, fuzzy msgid "Cancelled by user" msgstr "Annulé" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 #, fuzzy msgid "iPod opened" msgstr "ouvert" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, fuzzy, python-format msgid "Removing %s" msgstr "Supprimer %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, fuzzy, python-format msgid "Adding %s" msgstr "Podcast anonyme" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 #, fuzzy msgid "Opening MP3 player" msgstr "lu" #: src/gpodder/sync.py:510 #, fuzzy msgid "MP3 player opened" msgstr "lu" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, fuzzy, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Erreur pendant la mise à jour %(url)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 #, fuzzy msgid "MTP device" msgstr "Nouveau périphérique" #: src/gpodder/sync.py:762 #, fuzzy msgid "Opening the MTP device" msgstr "Nouveau périphérique" #: src/gpodder/sync.py:772 #, fuzzy, python-format msgid "%s opened" msgstr "ouvert" #: src/gpodder/sync.py:777 #, fuzzy, python-format msgid "Closing %s" msgstr "télécharger" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, fuzzy, python-format msgid "Adding %s..." msgstr "Podcast anonyme" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Ajouté" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Mis en file d'attente" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Activer les bulles de notifications" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Terminé" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Echoué" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Annulé" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "En pause" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Erreur: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Ajouter %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Supprimer %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Aucun abonnement" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Aucune description disponible" #: src/gpodder/model.py:679 msgid "unknown" msgstr "inconnu" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Autre" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vidéo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Mauvais nom d'utilisateur / mot de passe" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "En train de télécharger" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Contenu manquant sur le serveur" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erreur E/S : %(error)s:%(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erreur HTTP %(code)s:%(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Entier" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "télécharger" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Aucune description pour cette extension" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Commande: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Application par défaut" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Chargement des téléchargements incomplets" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Certain épisodes n'ont pas fini d'être téléchargés dans une session " "précédente" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d fichier partiel" msgstr[1] "%(count)d fichiers partiels" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Reprendre tout" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" "Des téléchargements incomplets d'une session précédente ont été trouvés" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Action" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmer les changements depuis gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Sélectionner les actions que vous voulez effectuer" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Envoyer des abonnements" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Vos abonnements ont été envoyés sur le serveur" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Liste envoyée avec succès" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Erreur durant l'envoi" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Épisode" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Taille" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Durée" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publié le" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Colonnes visibles" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Avancement" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Chargement des épisodes" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Aucun épisode dans la vue courante" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Aucun épisode disponible" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Aucun podcast dans cette vue" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Aucun abonnement" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Aucun téléchargement en cours" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d actif" msgstr[1] "%(count)d actifs" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d échoué" msgstr[1] "%(count)d échoués" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d mis en attente" msgstr[1] "%(count)d mis en attente" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "télécharge %(count)d fichier" msgstr[1] "télécharge %(count)d fichiers" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Veuillez signaler ce problème et redémarrer gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Exception non traitée" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Erreur de traitement du flux : %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Impossible d'ajouter certains podcasts" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Téléchargements terminés" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Téléchargements échoués" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Impossible d'ajouter certains podcasts" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Activer les bulles de notifications" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Activer les bulles de notifications" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d épisode de plus" msgstr[1] "%(count)d épisodes de plus" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Détails de l'épisode" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Démarrer le téléchargement maintenant" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Télécharger" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Annuler" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Mettre en pause" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Retirer de la liste" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Mettre à jour le podcast" #: src/gpodder/gtkui/main.py:1579 #, fuzzy msgid "Open download folder" msgstr "téléchargé" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marquer les épisodes comme obsolètes" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archiver" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Supprimer le podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Paramètres du Podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Erreur pendant la conversion du fichier." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transfert de fichier via Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Prévisualiser" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Flux" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Envoyer à" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Dossier local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Périphérique Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nouveaux" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Veuillez vérifier les préférences de votre lecteur multimédia dans la boîte " "de dialogue des préférences" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Erreur lors de l'ouverture du lecteur" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Ajout de podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" "Veuillez patienter pendant le téléchargement des informations de l'épisode" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Abonnements existants ignorés" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Vous êtes déjà abonnés à ces podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Ce podcast nécessite une authentification" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Veuillez vous connecter sur %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Échec de l'authentification" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Redirection de site Web détectée" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "L'URL %(url)s redirige vers %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Voulez-vous visitez le site web maintenant?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Impossible d'ajouter certains podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Certains podcast n'ont pas pu être ajoutés à votre liste:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Inconnu" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Redirection détectée" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Fusion des actions de l'épisode" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Les actions de l'épisode ont été fusionnées depuis gpodder.net" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Annulation..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nom de la nouvelle section:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Mise à jour de %(count)d flux..." msgstr[1] "Mise à jour de %(count)d flux..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Erreur pendant la mise à jour %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Le flux de %(url)s n'a pas pu être mis à jour" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Erreur durant la mise à jour du flux" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s mis à jour (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Aucun nouvel épisode" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Télécharge %(count)d nouvel épisode" msgstr[1] "Télécharge %(count)d nouvels épisodes" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "De nouveaux épisodes sont disponibles" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nouvel épisode ajouté à la liste de téléchargement" msgstr[1] "%(count)d nouvels épisodes ajoutés à la liste de téléchargement" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nouvel épisode disponible" msgstr[1] "%(count)d nouveaux épisodes disponibles" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Quitter gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Vous êtes en train de télécharger des épisodes. Vous pourrez reprendre les " "téléchargements la prochaine fois que vous démarrerez gPodder. Voulez-vous " "quitter maintenant?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Des épisodes sont verrouillés" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Les épisodes sélectionnés sont verrouillés. Veuillez dévérrouillez les " "épisodes que vous voulez supprimer avant de les supprimer" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Supprimer %(count)d episode ?" msgstr[1] "Supprimer %(count)d episodes ?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "La suppression des épisodes supprime les fichiers téléchargés." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Suppression des épisodes" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Veuillez patienter pendant la suppresion des épisodes" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Sélectionner les épisodes datés de plus de %(count)d jour" msgstr[1] "Sélectionner les épisodes datés de plus de %(count)d jours" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Sélectionner les épisodes lus" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Sélectionner les épisodes terminés" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Sélectionner les épisodes que vous voulez supprimer:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Supprimer des épisodes" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Aucun podcast sélectionné" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" "Veuillez sélectionner dans la liste des podcasts un podcast à mettre à jour" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" "Erreur de téléchargement pendant le téléchargement de %(episode)s: " "%(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Erreur de téléchargement" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Sélectionner les épisodes que vous voulez télécharger:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Définir comme obsolète" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Veuillez vérifier plus tard la présence de nouveaux épisodes" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Aucun nouvel épisode disponible" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Se connecter sur gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Veuillez vous connecter pour télécharger vos abonnements" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Abonnements sur gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Veuillez sélectionner dans la liste des podcasts un podcast à éditer." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Supprimer des podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Sélectionner le podcast que vous voulez supprimer." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Supprimer" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Suppresion du podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Veuillez patienter pendant que le podcast est supprimé" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" "Êtes-vous vraiment sûr de vouloir supprimer ce podcast et tous ses épisodes?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Suppression des podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Veuillez patienter pendant que les podcasts sont supprimés" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Êtes-vous vraiment sûr de vouloir supprimer le podcast sélectionné ainsi que " "tous ses épisodes?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" "Veuillez sélectionner dans la liste des podcasts un podcast à supprimer." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Fichier OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Import depuis OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importer des podcasts depuis un fichier OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Rien à exporter" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Votre liste d'abonnements à des podcasts est vide. Veuillez vous abonner à " "des podcasts avant d'exporter votre liste d'abonnements." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Export vers OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d abonnement exporté" msgstr[1] "%(count)d abonnements exportés" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Votre liste de podcast a été exportée avec succès" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Impossible d'exporter OPML vers un fichier. Veuillez vérifier les " "permissions." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "L'export OPML a échoué" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Aucun épisode disponible" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "De nouveaux épisodes sont disponibles" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "publié le" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Télécharger mes abonnements depuis gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "A propos de gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Faire une donation / Liste de souhaits" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Signaler un problème" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Remerciements pour la traduction" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traduit par:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Remerciements à:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" "Veuillez sélectionner dans la liste des épisodes un épisodes pour afficher " "les notes." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Aucun épisode sélectionné" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Impossible de démarrer gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Erreur D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Entier" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flottant" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booléen" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Chaîne" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publié le %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "lu" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "non lu" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "aujourd'hui" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "%s téléchargé" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Supprimé" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nouvel épisode" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Épisode téléchargé" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Épisode vidéo téléchargé" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Image téléchargée" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Fichier téléchargé" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "fichier manquant" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "jamais affiché" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "jamais lu" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "jamais ouvert" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "affiché" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "ouvert" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "suppression évitée" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Tous les épisodes" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "depuis tous les podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Abonnement en pause" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Rien à coller." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Presse-papiers vide" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nom d'utilisateur" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Nouvel utilisateur" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Connexion" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Authentification requise" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Mot de passe" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Sélectionner la destination" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Paramètre" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Défini à" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Impossible de définir %(field)s à %(value)s. Nécessite ce type de donnée: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Erreur pendant la définition d'une option" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Ne rien faire" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Afficher la liste des épisodes" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Ajouter à la liste de téléchargement" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Télécharge immédiatemment" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Définir comme obsolète" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Erreur: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nom" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Durée" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Extensions" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurer le lecteur audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Commande:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurer le lecteur vidéo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuellement" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "après %(count)d jour" msgstr[1] "après %(count)d jours" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Remplacer la liste des abonnements sur le serveur" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Les podcasts distant qui n'ont pas été ajoutés localement seront retirés du " "serveur. Continuer ?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Chercher" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "L'URL spécifiée ne fournit aucun élément de podcast OPML valide." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Aucun flux trouvé" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Il n'y a aucune chaîne Youtube qui corresponde à cette requête." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Aucune chaîne trouvée" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Sélectionner tout" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Sélectionner aucun" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Rien n'est sélectionné" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d épisode" msgstr[1] "%(count)d épisodes" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "taille: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Le flux de %(url)s n'a pas pu être mis à jour" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Erreur lors de l'ouverture du lecteur" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Action" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nom de la nouvelle section:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Sélectionner une nouvelle image de couverture pour le podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Vous pouvez seulement glisser-déposer une seule image ou une URL ici." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Glisser-déposer" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" "Vous pouvez seulement déposer des fichiers locaux ou des URL http:// ici." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 #, fuzzy msgid "Please set up your device in the preferences dialog." msgstr "" "Veuillez vérifier les préférences de votre lecteur multimédia dans la boîte " "de dialogue des préférences" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 #, fuzzy msgid "Please check the settings in the preferences dialog." msgstr "" "Veuillez vérifier les préférences de votre lecteur multimédia dans la boîte " "de dialogue des préférences" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Liste envoyée avec succès" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Erreur pendant la conversion du fichier." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Tous" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "supprimé" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Téléchargé" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archivé" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vidéos" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Définir comme obsolète" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "télécharger" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Suppression des épisodes" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Supprimer" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Erreur durant l'envoi" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Tout mettre à jour" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Mise à jour" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renommer" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Changer de section" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Se désabonner" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Supprimer ce podcast et ces épisodes ?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nom de la nouvelle section:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nouveau nom :" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Supprimer cet épisode?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marquer comme nouveau" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Autoriser la suppression" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Ajouter à la liste de lecture" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Ajout des podcast ..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Impossible d'ajouter certains podcasts" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Reprendre tout" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Piste inconnue" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s sur Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Pistes publiées par %s sur Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Favoris de %s sur Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Pistes mises en favoris par %s sur Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicateur Ubuntu App" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Afficher la fenêtre principale" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Quitter" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "Lorsque de nouveaux épisodes sont trouvés:" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Erreur pendant la conversion du fichier." #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Erreur pendant la conversion du fichier." #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Importer depuis un fichier OPML" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Podcast anonyme" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Veuillez vérifier plus tard la présence de nouveaux épisodes" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Veuillez vérifier plus tard la présence de nouveaux épisodes" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Erreur pendant la conversion du fichier." #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "\"Tous les épisodes\" dans la liste des podcasts" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Ajouter un nouveau podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Éditeur de podcast gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Section:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Désactiver la mise à jour du flux (mettre en pause l'abonnement)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Général" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Authentification HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nom d'utilisateur:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Mot de passe:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Emplacements" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Télécharger vers:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Site web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "label du site web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avancés" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Éditeur de configuration gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Chercher :" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Afficher tout" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Vérifier la présence de nouveaux épisodes" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Télécharger des nouveaux épisodes" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Préférences" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "Abonnements" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Découvrir de nouveaux podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Ajouter un podcast via son URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importer depuis un fichier OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exporter vers un fichier OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Aller sur gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "Épisodes" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Lire" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Ouvrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Activer/Désactiver le statut nouveau" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Changer le verrou de suppression" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Périphérique Bluetooth" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "Vue" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Tous les épisodes\" dans la liste des podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Utiliser des sections pour la liste des podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barre d'outils" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Description de l'épisode" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Cacher les épisodes supprimés" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Épisodes téléchargés" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Épisodes non lus" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Cacher les podcasts sans épisode" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Aide" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manuel d'utilisateur" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtre:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limiter le débit à" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limiter le nombre de téléchargements à" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Sélectionner des épisodes" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Paramètre" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Bienvenue sur gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Votre liste de podcast a été exportée avec succès" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Choisissez une liste d'exemples de podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Ajouter un podcast via son URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Télécharger mes abonnements depuis gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Lecteur audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Lecteur vidéo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensions" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synchroniser les abonnements et les actions de l'épisode" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Remplacer la liste du serveur avec les abonnements locaux" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nom du périphérique:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalle de mise à jour:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Nombre maximum de podcasts par épisode:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Lorsque de nouveaux épisodes sont trouvés:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Mise à jour" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Supprimer les épisodes joués:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Supprimer les épisodes lus, inachevés compris" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Supprimer aussi les épisodes non lus" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Nettoyage" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 #, fuzzy msgid "Device type:" msgstr "Nom du périphérique:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Remplacer la liste des abonnements sur le serveur" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Presse-papiers vide" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 #, fuzzy msgid "Only sync unplayed episodes" msgstr "Épisode anonyme" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 #, fuzzy msgid "Devices" msgstr "Nom du périphérique:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Éditer la configuration" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Trouver des nouveaux podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Sélectionner tout" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Ne rien sélectionner" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Recherche" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Top des _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "En cours de lecture" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Ajout de podcasts" #: share/gpodder/ui/qml/main_default.qml:41 #, fuzzy msgid "Settings" msgstr "Paramètre" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 #, fuzzy msgid "Thanks" msgstr "Remerciements à:" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Nom du périphérique:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Sélectionner la destination" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Aucun podcast dans cette vue" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Activer les bulles de notifications" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Se connecter sur gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Remplacer la liste des abonnements sur le serveur" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Liste de lecture" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Presse-papiers vide" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Détails de l'épisode" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Épisode anonyme" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Épisode anonyme" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notes" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "lu" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Changer de section" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Podcast" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Aucun épisode" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Retourner à la liste des épisodes" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Terme de recherche ou URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Top list" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mon gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Exemples" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "propulsé par gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 #, fuzzy msgid "Subscribe" msgstr "abonné" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minute" msgstr[1] "%(count)s minutes" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s seconde" msgstr[1] "%(count)s secondes" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "publié le" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "publié le" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Ce podcast nécessite une authentification" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Vous êtes déjà abonnés à ces podcasts:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Aucun abonnement" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Aucun abonnement" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s ajouté avec succès." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Cette option de configuration n'existe pas." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Renommer %(old_title)s en %(new_title)s." #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Se désabonner" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Podcast anonyme" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d nouvel épisode" msgstr[1] "%(count)d nouveaux épisodes" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Vérifier la présence de nouveaux épisodes" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Ajout de podcasts" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "Aucun podcast trouvé." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Afficher les messages de debug sur la sortie standard" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "S'abonner à l'URL donnée" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Numéro de processus de l'application Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Client de Podcasts gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Client de podcasts" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "S'abonner à du contenu audio et vidéo depuis le web" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Erreur pendant la conversion du fichier." #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Veuillez patienter..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Démarrer l'interface QML de gPodder" gpodder-3.5.2/po/gl.po0000644000175000017500000021361212220345607014143 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Gonçalo Cordeiro , 2009-2010,2012. # Teo Ramirez , 2007. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Gonçalo Cordeiro \n" "Language-Team: Galician (http://www.transifex.com/projects/p/gpodder/" "language/gl/)\n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder en %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "vai %(count)d día" msgstr[1] "vai %(count)d días" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoxe" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Onte" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(descoñecido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "e" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado polo usuario" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Escribindo datos no disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Abrindo a base de datos do iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "Abriuse o iPod" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Gardando a base de datos do iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Escribindo a base de datos gtkpod estendida" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Eliminando %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Engadindo %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Produciuse un erro ao copiar %(episode)s: non hai espazo suficiente en " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Abrindo o reprodutor de MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Abriuse o reprodutor de MP3" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Produciuse un erro ao abrir %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Abrindo o dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s está aberto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Pechando %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s está pechado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Engadindo %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Engadido" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Na fila" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sincronizando" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Finalizada" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fallou" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Detida" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Erro: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Engadir %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Eliminar %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Non hai suficientes medios para facer flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Ese elemento no existe no Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Xa foi «flatteado» ou ben se trata dun elemento propio" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Solicitude non válida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Non hai conexión de Internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Sen descrición" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Sen descrición dispoñíbel" #: src/gpodder/model.py:679 msgid "unknown" msgstr "descoñecido" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Outro" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vídeo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Nome de persoa usuaria ou contrasinal incorrecto" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Descargando" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Faltan contidos do servidor" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro de E/S: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro de HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Integración en Ubuntu Unity" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Enteiro" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Seleccionar os descargados" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Non hai unha descrición para esta extensión." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Non se encontrou o comando: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Non se encontrou o módulo de Python: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicación por defecto" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Cangando as descargas incompletas" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "A descarga dalgúns episodios nunha sesión anterior non terminou." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d ficheiro parcial" msgstr[1] "%(count)d ficheiros parciais" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Retomar todas" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Encontráronse descargas incompletas dunha sesión anterior." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Acción" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar os cambios desde gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Seleccione as accións que quere levar a cabo." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Enviando as subscricións" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "As súas subscricións están sendo enviadas ao servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "A lista foi enviada con éxito." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Erro ao enviar" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episodio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamaño" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duración" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Data de lanzamento" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Columnas visíbeis" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Progreso" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Cargando episodios" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Non hai ningún episodio na vista actual" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Non hai episodios dispoñíbeis" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Non hai ningún podcast nesta vista" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Sen subscricións" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Non hai tarefas activas" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d activa" msgstr[1] "%(count)d activas" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fallou" msgstr[1] "%(count)d fallaron" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d na fila" msgstr[1] "%(count)d na fila" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "descargando %(count)d ficheiro" msgstr[1] "descargando %(count)d ficheiros" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "sincronizando %(count)d ficheiro" msgstr[1] "sincronizando %(count)d ficheiros" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] " %(queued)d tarefa na fila" msgstr[1] " %(queued)d tarefas na fila" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Informe deste problema e reinicie o gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Excepción non manexada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Erro ao analizar o feed: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Non se puideron descargar algúns episodios:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "As descargas terminaron" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "As descargas fallaron" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Non se puideron sincronizar algúns episodios:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Rematou a sincronización do dispositivo" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Produciuse un fallo ao sincronizar o dispositivo" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episodio máis" msgstr[1] "%(count)d episodios máis" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalles do episodio" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Comezar a descarga agora" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Descargar" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Deter" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Eliminar da lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Actualizar o podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir o cartafol de descargas" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar os episodios como vellos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arquivar" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Eliminar podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Configuración de podcasts" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Erro ao converter o ficheiro." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferencia de ficheiros por Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Previsualizar" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Fluxo" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Cartafol local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Novo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Faille Flatter" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Estado Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Verifique a configuración do seu reprodutor multimedia no dialogo de " "preferencias." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Erro ao abrir o reprodutor" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Engadindo podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Agarde mentres se descarga a información do episodio." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Omitíronse as subscricións existentes" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Xa está subscrito a estes podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "O podcast require autenticación" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Inicie unha sesión en %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Fallou a autenticación" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Detectouse unha redirección de sitio web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "O URL %(url)s redirecciona a %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Quere visitar agora o sitio web?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Non foi posíbel engadir algúns podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Algúns podcasts non puideron ser engadidos á súa lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Descoñecido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Detectouse unha redirección" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Combinando as accións de episodios" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "As accións de episodios de gpodder.net foron combinadas" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Cancelando..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nova sección:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Actualizando %(count)d feed..." msgstr[1] "Actualizando %(count)d feeds..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Houbo un erro ao actualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "O fío de %(url)s non se puido actualizar." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Erro ao actualizar o fío" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Actualizado %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Non hai episodios novos" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Descargando %(count)d episodio novo." msgstr[1] "Descargando %(count)d episodios novos." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Hai episodios novos dispoñíbeis" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "Engadiuse %(count)d episodio novo á lista de descargas." msgstr[1] "Engadíronse %(count)d episodios novos á lista de descargas." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d episodio novo dispoñíbel" msgstr[1] "%(count)d episodios novos dispoñíbeis" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Saír do gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Está descargando episodios. Pode continuar as descargas a próxima vez que " "inicie o gPodder. Quere saír agora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Os episodios están bloqueados" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Os episodios seleccionados están bloqueados. Desbloquee os episodios que " "quere eliminar antes de tentar eliminalos." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Quere eliminar %(count)d episodio?" msgstr[1] "Quere eliminar %(count)d episodios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "A eliminación dos episodios borra os ficheiros descargados." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Eliminando os episodios" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Agarde mentres se eliminan os episodios" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Seleccionar os que teñan máis de %(count)d día" msgstr[1] "Seleccionar os que teñan máis de %(count)d días" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Seleccionar os reproducidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Seleccionar os finalizados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Seleccione os episodios que quere eliminar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Eliminar episodios" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Non se seleccionou ningún podcast" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Seleccione un podcast da lista de podcasts para actualizalo." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Erro de descarga mentres se procesaba %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Erro de descarga" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Seleccione os episodios que quere descargar:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcar como antigo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Verificar por episodios novos máis tarde." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Non hai episodios novos dispoñíbeis" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Iniciar sesión en gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Inicie unha sesión para descargar as súas subscricións" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Subscricións en gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Seleccione un podcast da lista de podcasts para editalo." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Eliminar os podcast" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Seleccione os podcasts que quere eliminar." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Eliminar" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Eliminando o podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Agarde mentres se elimina o podcast" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Quere eliminar este podcast e os seus episodios?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Eliminando os podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Agarde mentres se eliminan os podcasts" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Quere eliminar os podcast seleccionados e os seus episodios?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Seleccione un podcast da lista de podcasts para eliminalo." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Ficheiros OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar de OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts dun ficheiro OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Non hai nada para exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "A súa lista de subscricións está baleira. Subscríbase a algún podcast antes " "de tentar exportar a súa lista de subscricións." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar a OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Exportouse %(count)d subscrición" msgstr[1] "Exportáronse %(count)d subscricións" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "A súa lista de podcasts foi exportada con éxito." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Non se pode exportar o OPML ao ficheiro. Verifique os seus permisos." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Fallo ao exportar a OPML" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Non hai actualizacións dispoñíbeis" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Xa está a usar a última versión de gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Hai unha nova versión dispoñíbel" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Versión instalada: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versión máis nova: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Data de lanzamento: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Quere descargar a última versión desde gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Sobre o gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Doar / Suxestións" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Informar dun problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Teo Ramírez , 2007.\n" "Gonçalo Cordeiro , 2009-2012." #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traducido por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Agradecementos:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Seleccione un episodio da lista de episodios para mostrar os guións." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Non hai episodios seleccionados" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Non é posíbel iniciar o gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Erro de D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Enteiro" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flotante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Cadea" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Rexístrese" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Flatteado" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "data de lanzamento %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "reproducido" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "non reproducido" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoxe" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "descargados %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Eliminados" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Episodio novo" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episodio descargado" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episodio de video descargado" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imaxe descargada" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Ficheiro descargado" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "falta o ficheiro" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "non visualizado nunca" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "non reproducido nunca" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "non aberto nunca" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "visualizado" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "aberto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "impediuse unha eliminación" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos os episodios" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "de todos os podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Subscrición detida" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Non hai nada para colar." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "O portapapeis está baleiro" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nome de persoa usuaria" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Persoa usuaria nova" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Iniciar sesión" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autenticación requirida" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Contrasinal" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Escolla un destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Configuración" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Estabelecer como" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Non se pode estabelecer %(field)s co valor %(value)s. Precísase o tipo de " "datos: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Erro ao definir a opción" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Non facer nada" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostrar a lista de episodios" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Engadir á lista de descargas" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Descargar inmediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ningún" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Baseado en sistema de ficheiros" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Marcar como reproducido" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Eliminar do gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Erro" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Convertendo a %(format)s" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nome" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duración" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Información do módulo de extensión" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Rexístrese co Flattr e apoie os editores" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Rexistrarse co Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Sesión iniciada como %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Saír" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "A integración co Flattr require WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "Non se puido encontrar o WebKit/Gtk" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Non se pode activar a extensión" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Información do módulo de extensión" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurar o reprodutor de audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar o reprodutor de vídeo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "despois de %(count)d día" msgstr[1] "despois de %(count)d días" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Substituír a lista de subscricións do servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Os podcasts remotos que non foron engadidos localmente serán eliminados do " "servidor. Quere continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Seleccione o cartafol para o punto de montaxe" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Seleccione o cartafol para o punto de montaxe" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Buscar" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "O URL especificado non fornece ningún elemento válido de podcast OPML." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Non se encontraron feeds" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Non hai canles do YouTube que coincidan con esta consulta." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Non se encontraron canles" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Seleccionar todo" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Non seleccionar ningún" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Non hai nada seleccionado" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episodio" msgstr[1] "%(count)d episodios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamaño: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "O fío de %(url)s non se puido actualizar." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o reprodutor" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Engadir unha sección" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nova sección:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Seleccione unha portada nova para o podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Só pode soltar unha imaxe ou URL aquí." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arrastrar e soltar" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Só pode soltar ficheiros locais e URL http:// aquí." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Non hai ningún dispositivo configurado" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Configure o seu dispositivo no diálogo das preferencias." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Non foi posíbel abrir o dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Verifique as configuracións no diálogo de preferencias." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Non hai espazo suficiente non dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "É preciso o seguinte espazo libre: %(required_space)s\n" "Quere continuar?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "A lista foi enviada con éxito." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Erro ao converter o ficheiro." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Todos" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ocultar os eliminados" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Descargados" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Arquivados" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vídeos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Reproducido parcialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Descargas sen reproducir" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Flatteados (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Flattear isto (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Rexistrarse no Flattr coas definicións." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flatteando o episodio…" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Non foi posíbel iniciar sesión no Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Eliminar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Subindo as subscricións..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Houbo un erro ao subir:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Actualizar todos" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Actualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renomear" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Mudar de sección" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Cancelar a subscrición" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Cominando as accións de episodios..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Combinando as accións de episodios (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Quere eliminar este podcast e os episodios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Novo nome de sección:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Novo nome:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Quere eliminar este episodio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcar como nova" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir a eliminación" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Engadir á fila de reprodución" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Engadindo podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Non foi posíbel engadir algúns podcasts" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Retomar" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Pista descoñecida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s no Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Pistas publicadas por %s no Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Os favoritos de %s no Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "As pistas etiqutadas como favoritas por %s no Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Descarga de subtítulos para as charlas TED" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Descarga subtútulos .srt para os vídeos de charlas TED" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Converter os ficheiros de vídeo a MP4 para Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Converter todos os vídeos a un formato compatíbel con Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "O ficheiro foi convertido" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicador de aplicativo de Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Mostrar un indicador de estado na barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar a xanela principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Saír" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Mostrar o progreso da descarga na icona do Lanzador de Ubuntu." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Renomear os episodios despois de os descargar" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" "Renomear os episodios como «.\" ao descargalos" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Houbo un fallo na conversión" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Transcodificar os ficheiros .m4a a .mp3 ou .ogg usando o ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Convertendo a %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Houbo un fallo na conversión" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Eliminar as portadas dos ficheiros OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Elimina as portadas de todos os ficheiros OGG descargados" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Eliminar as portadas" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Verificar por episodios novos máis tarde." #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Verificar por episodios novos máis tarde." #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizar o audio ao recodificar" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizar o volume dos ficheiros de audio con «normalize-audio»" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "O ficheiro foi normalizado" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Icona de estado GTK" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Mostrar unha icona de estado nos escritorios baseados en GTK" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizar ao iniciar" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiza a xanela do gPodder no inicio." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Houbo un fallo na conversión" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Transcodificar os ficheiros .m4a a .mp3 ou .ogg usando o ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Etiquetar os ficheiros descargados con Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Engadir os títulos de episodio e de podcast ás etiquetas MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integración en Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Mostrar o progreso da descarga na icona do Lanzador de Ubuntu." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Engadir un podcast novo" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor de Podcasts gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sección:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desactivar a actualización de feeds (deter a subscrición)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Xeral" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticación HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nome de persoa usuaria:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Contrasinal:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Localizacións" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Descargar a:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sitio Web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etiqueta do sitio web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanzado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor de configuración do gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Buscar por:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostrar todo" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Verificar se hai episodios novos" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Descargar episodios novos" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencias" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Subscricións" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Descubrir novos podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Engadir un podcast a través dun URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar dun ficheiro OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar a un ficheiro OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir a gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproducir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Alternar para o novo estado" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Cambiar o bloqueo de eliminación" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizar no dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ver" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Todos os episodios\" na lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usar seccións na lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de ferramentas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descricións de episodio" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ocultar os episodios eliminados" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episodios descargados" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episodios non reproducidos" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ocultar os podcast sen episodios" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Axuda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual de persoa usuaria:" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Actualizacións de software" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitar a velocidade de descarga a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitar o número de descargas a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Seleccionar episodios" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Comezar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Benvido/a ao gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "A súa lista de podcasts está baleira." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Seleccionar dunha lista de podcasts de exemplo" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Engadir un podcast escribindo o seu URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Recuperar as miñas subscricións desde gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Reprodutor de audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Reprodutor de vídeo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensións" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Flattear automaticamente os episodios ao reproducilos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar as accións de subscrición e episodios" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Substituír a lista do servidor coas subscricións locais" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nome do dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de actualización:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de episodios por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Cando se encontren episodios novos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Actualizando" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Eliminar os episodios reproducidos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Eliminar os episodios reproducidos incluso se non foron terminados" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Eliminar tamén os episodios sen reproducir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Punto de montaxe:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Despois de sincronizar un episodio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Substituír a lista do servidor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "A lista de reprodución está baleira" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Sincronizar só os episodios sen reproducir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar a configuración" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Encontrar podcast novos" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Seleccionar todo" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Deseleccionar todo" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Buscar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Mellores _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Reproducindo agora" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Engadindo podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Configuracións" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Sobre" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecementos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nome do dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Configuracións de gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientación da pantalla" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Rotación automática" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indexación de medios" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Mostrar os podcasts no aplicativo Music" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Auto-Flattr ao reproducir" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Activar a sincronización" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Iniciar sesión en gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Substituír a lista do servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Aínda non ten unha conta? Rexístrese aquí" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Reproducir a fila" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "A lista de reprodución está baleira" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalles do episodio" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Descargar espisodios" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Reproducir episodios" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Guións de episodios" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Seleccionar os descargados" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Inverter a selección" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Non hai podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Engada agora o seu primeiro podcast." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Non hai episodios" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Toque aquí para mudar o filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar os episodios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Termo de busca ou URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Toplist" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Meu gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Exemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "creado por gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 #, fuzzy msgid "Subscribe" msgstr "Cancelar a subscrición" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "Data de lanzamento: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Data de lanzamento: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "As extensións requiriron unha actualización de podcast." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "As extensións requiriron a descarga dun episodio." #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "URL non válido: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Non está subscrito a %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Non se pode subscribir a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Non se pode subscribir a %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s foi engadido con éxito." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Esta opción de configuración non existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Só se poden definir nodos de configuración folla (leaf node)." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Renomeouse %(old_title)s como %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Eliminouse a subscrición a %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "As actualizacións están desactivadas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d episodio novo" msgstr[1] "%(count)d episodios novos" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Verificando se hai episodios novos" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Omitindo %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Desactivando a actualización do fío de %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Activando a actualización do fío de %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Escoitando en TODAS as interfaces de rede." #: bin/gpo:622 msgid "No podcasts found." msgstr "Non se encontrou ningún podcast." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Introduza o index ao que se subscribir (use -?- para unha lista)" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor incorrecto." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL non válido: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "Cambiáronse os URL de %(old_url)s a %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Erro de sintaxe: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Comando ambiguo. Quería dicir..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "A función solicitada non está dispoñíbel." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Imprimir a saída de depuración na saída estándar" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Subscribirse ao URL indicado" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número de proceso de aplicación de Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Cliente de podcast gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Cliente de podcast" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Subscribirse a contidos de audio e vídeo desde a web" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Converter os ficheiros .flv de YouTube a .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Isto é útil para reproducir os vídeos descargados en reprodutores de " #~ "hardware" #~ msgid "Convert FLV to MP4" #~ msgstr "Converter de FLV a MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Converter o audio M4A a MP3 ou OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Transcodificar os ficheiros .m4a a .mp3 ou .ogg usando o ffmpeg" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "Converter o audio M4A a MP3 ou OGG" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "O ficheiro foi convertido" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Houbo un fallo na conversión" #~ msgid "OK" #~ msgstr "Aceptar" #~ msgid "Please wait..." #~ msgstr "Agarde..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Iniciar a interface QML do gPodder" gpodder-3.5.2/po/he.po0000644000175000017500000021613312220345607014136 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Amiad Bareli , 2010, 2011, 2012. # , 2011, 2012. # , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/gpodder/language/" "he/)\n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder על %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "לפני יום" msgstr[1] "לפני %(count)d ימים" #: src/gpodder/util.py:495 msgid "Today" msgstr "היום" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "אתמול" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(לא ידוע)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "שנייה אחת" msgstr[1] "%(count)d שניות" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "שעה אחת" msgstr[1] "%(count)d שעות" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "דקה אחת" msgstr[1] "%(count)d דקות" #: src/gpodder/util.py:1245 msgid "and" msgstr "וגם" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "בוטל בידי משתמש" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "כותב מידע לכונן" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "פותח בסיס נתונים של iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod נפתח" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "שומר בסיס נתונים של iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "כותב לבסיס נתונים מורחב של gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "מסיר את %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "מוסיף %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "שגיאה בהעתקת %(episode)s: אין די מקום פנוי ב־%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "פותח נגן MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "נגן MP3 נפתח" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "שגיאה בפתיחת %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "התקן MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "פותח התקן MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s נפתח" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "סוגר את %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s נסגר" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "מוסיף את %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "נוסף" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "ממתין" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "מסנכרן" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "הסתיים" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "נכשל" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "בוטל" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "הושהה" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "שגיאה: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "הוסף את %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "הסר את %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "אין מספיק אמצעים ל־flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "הפריט אינו קיים ב־Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "כבר נתרם ב־flattr או שהפריט שלך" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "בקשה שגויה" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "אין תיאור" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "אין תיאור זמין" #: src/gpodder/model.py:679 msgid "unknown" msgstr "לא ידוע" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "אחר" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "וידאו" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "שמע" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "שם משתמש/ססמה שגויים" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "מוריד" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "חסר תוכן מהשרת" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "שגיאת I/O: %(error)s: %(filename)s‎" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "שגיאת HTTP %(code)s: %(message)s‎" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "שילוב עם ממשק Unity של אובונטו" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Integer" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "השהה הורדה" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "אין תיאורים זמינים להרחבה זו." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "הפקודה לא נמצאה: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "מודול פייתון לא נמצא: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "פקודה: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "יישום ברירת מחדל" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "טוען הורדות שלא הושלמו" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "הורדת מספר פרקים לא הסתיימה בהפעלה הקודמת." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "קובץ חלקי אחד" msgstr[1] "%(count)d קבצים חלקיים" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "התחל מחדש הכל" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "נמצאו הורדות מההפעלה הקודמת שלא הושלמו." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "פעולה" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "אשר שינויים מ־gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "בחר את הפעולות שברצונך לבצע." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "מעלה הרשמות" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "ההרשמות שלך הועלו לשרת." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "רשימה הועלתה בהצלחה." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "התרחשה שגיאה בהעלאה" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "פרק" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "גודל" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "משך" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "פורסם" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "עמודות מוצגות" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "התקדמות" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "טוען פרקים" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "אין פרקים בתצוגה זו" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "אין פרקים זמינים" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "אין פודקסטים בתצוגה זו" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "אין הרשמות" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "אין משימות פעילות" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "אחת פעילה" msgstr[1] "%(count)d פעילות" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "אחת נכשלה" msgstr[1] "%(count)d נכשלו" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "אחת ממתינה" msgstr[1] "%(count)d ממתינות" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "מוריד קובץ אחד" msgstr[1] "מוריד %(count)d קבצים" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "מסנכרן קובץ אחד" msgstr[1] "מסנכרן %(count)d קבצים" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "משימה אחת ממתינה" msgstr[1] "%(queued)d משימות ממתינות" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "דווח על הבעיה הזו ואתחל את gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Unhandled exception" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "שגיאת תחביר הזנה: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "לא ניתן להוריד כמה פרקים:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "ההורדות הסתיימו" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "הורדות נכשלו" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "לא ניתן לסנכרן כמה פרקים:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "סנכרון ההתקן הסתיים" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "סנכרון ההתקן נכשל" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "אחד עוד פרק" msgstr[1] "עוד %(count)d פרקים" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "פרטי הפרק" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "התחל הורדה עכשיו" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "הורד" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "בטל" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "השהה" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "הסר מהרשימה" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "עדכן פודקסט" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "פתח תיקיית הורדה" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "סמן פרקים כישנים" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "ארכיון" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "הסר פודקסט" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "הגדרות פודקסט" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "שגיאה בהמרת קובץ." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "העברת קבצים דרך בלוטות׳" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "תצוגה מקדימה" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "הזרם" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "שלח אל" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "תיקיה מקומית" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "התקן בלוטות׳" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "חדש" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "תרום ב־Flattr" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "מצב Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "אנא בדוק את הגדרות נגן המדיה שלך בחלון המאפיינים." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "שגיאה בפתיחת נגן" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "מוסיף פודקסטים" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "אנא המתן עד שמידע הפרק ירד." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "הרשמות קיימות דולגו" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "אתה כבר רשום לפודקסטים האלה:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "הפודקסט דורש אימות" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "בבקשה התחבר אל %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "אימות נכשל" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "התגלה ניתוב מחדש לאתר" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "הכתובת %(url)s מפנה מחדש אל %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "אתה רוצה לבקר באתר עכשיו?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "לא יכול להוסיף מספר פודקסטים" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "כמה פודקסטים לא יכולים להתווסף לרשימה שלך:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "לא ידוע" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "התגלה ניתוב מחדש" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "השוואת פעולות פרק" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "פעולות פרק מ־gpodder.net הושוו." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "מבטל..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "שם חדש:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "מעדכן הזנה..." msgstr[1] "מעדכן %(count)d הזנות..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "שגיאה בעדכון %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "ההזנה בכתובת %(url)s לא יכולה להתעדכן." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "שגיאה בעדכון הזנה" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "מעדכן את %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "אין פרקים חדשים" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "מוריד פרק חדש." msgstr[1] "מוריד %(count)d פרקים חדשים." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "פרקים חדשים זמינים" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "פרק חדש נוסף לרשימת ההורדות." msgstr[1] "%(count)d פרקים חדשים נוספו לרשימת ההורדות." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "פרק חדש זמין" msgstr[1] "%(count)d פרקים חדשים זמינים" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "יציאה מ־gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "אתה באמצע הורדת פרקים. אתה יכול להמשיך את ההורדות בהפעלה הבאה של gPodder. " "האם ברצונך לצאת?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "הפרקים נעולים" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "הפרקים שבחרת נעולים. שחרר את הנעילה שלהם כדי שתוכל למחוק אותם." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "למחוק פרק?" msgstr[1] "למחוק %(count)d פרקים?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "מוחק את הפרקים ומסיר את הקבצים שהורדו." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "מוחק פרקים" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "אנא המתן בעת מחיקת הפרקים" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "בחר ישן יותר מיום אחד" msgstr[1] "בחר ישן יותר מ־%(count)d ימים" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "בחר מנוגנים" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "בחר פרקים שהסתיימו" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "בחר את הפרקים שברצונך למחוק:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "מחק פרקים" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "לא נבחרו פודקסטים" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "בחר פודקסט מהרשימה לעדכון." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "התרחשה שגיאה בהורדת %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "שגיאת הורדה" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "בחר את הפרקים שברצונך להוריד:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "סמן כישן" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "אנא בדוק מאוחר יותר לפרקים חדשים." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "לא זמינים פרקים חדשים" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "התחבר אל gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "אנא התחבר כדי להוריד את ההרשמות שלך." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "הרשמות ב־gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "בחר פודקסט מהרשימה לעריכה." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "פודקסט" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "הסר פודקסטים" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "בחר את הפודקסט שברצונך להסיר." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "הסר" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "מסיר פודקסט" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "אנא המתן להסרת הפודקסט" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "אתה בטוח שברצונך להסיר את הפודקסט הזה ואת הפרקים שלו?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "מסיר פודקסטים" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "אנא המתן להסרת הפודקסטים" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "אתה בטוח שברצונך להסיר את הפודקסטים הנבחרים ואת הפרקים שלהם?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "בחר פודקסט מהרשימה להסרה." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "קובצי OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "ייבא מקובץ OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "ייבא פודקסטים מקובץ OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "אין כלום לייצוא" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "רשימת ההרשמות שלך ריקה. הרשם לכמה פודקסטים לפני ייצוא הרשימה." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "ייצא לקובץ OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "הרשמה אחת יוצאה" msgstr[1] "%(count)d הרשמות יוצאו" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "רשימת הפודקסטים שלך יוצאה בהצלחה." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "לא ניתן לייצא לקובץ OPML. בדוק את ההרשאות שלך." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "ייצוא OPML נכשל" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "אין עדכונים זמינים" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "יש לך את הגרסה העדכנית ביותר של gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "גרסה חדשה זמינה" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "גרסה מותקנת: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "הגרסה החדשה ביותר: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "תאריך פרסום: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "להוריד את הגרסה העדכנית מ־gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "על אודות gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "תרומות / משאלות" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "דווח על בעיה" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "מתרגמים" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "תורגם בידי:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "תודות:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "בחר פרק מרשימת הפרקים להצגת ההערות." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "לא נבחרו פרקים" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "לא ניתן להפעיל את gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "שגיאת D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "מאת %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Integer" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Float" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolean" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "String" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "כניסה" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "נתרם ב־Flattr" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "פורסם %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "הושמע" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "לא הושמע" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "היום" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "הורד %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "נמחק" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "פרק חדש" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "פרק הורד" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "פרק וידאו הורד" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "תמונה הורדה" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "קובץ הורד" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "קובץ חסר" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "לא הוצג מעולם" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "לא הושמע מעולם" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "לא נפתח מעולם" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "הוצג" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "נפתח" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "מחיקה מנועה" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "כל הפרקים" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "מכל הפודקסטים" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "הרשמה מושהת" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "אין כלום להדביק." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "הלוח ריק" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "שם משתמש" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "משתמש חדש" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "התחבר" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "נדרש אימות" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "ססמה" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "בחר יעד" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "הגדרה" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "הגדרה" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "לא ניתן להגדיר בשדה %(field)s את הערך %(value)s. סוג מידע נדרש: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "שגיאה בהגדרת אפשרות" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "אל תעשה דבר" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "הצג רשימת פרקים" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "הוסף לרשימת ההורדות" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "הורד מידית" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "ללא" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "מבוסס מערכת קבצים" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "סמן כמושמע" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "מחק מ־gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "שגיאה" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "המר ל־%(format)s" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "שם" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "משך" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "מידע על מודול ההרחבה" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "התחבר ל־Flattr ותמוך במפיקים" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "כניסה ל־Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "מחובר בתור %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "התנתק" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "שילוב Flattr דורש WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk לא נמצא" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "לא ניתן להפעיל את ההרחבה" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "מידע על מודול ההרחבה" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "הגדר נגן אודיו" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "פקודה:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "הגדר נגן וידאו" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "ידנית" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "אחרי יום אחד" msgstr[1] "אחרי %(count)d ימים" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "החלף רשימת הרשמות בשרת" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "פודקסטים מרוחקים שלא נוספו באופן מקומי יוסרו מהשרת. האם להמשיך?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "בחר תיקייה לנקודת עיגון" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "בחר תיקייה לנקודת עיגון" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "חפש" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "הכתובת אינה מזינה קובץ OPML חוקי." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "לא נמצאו הזנות" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "אלה לא ערוצי YouTube שמתאימים לאפשרות הזו." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "לא נמצאו ערוצים" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "בחר הכל" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "אל תבחר כלום" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "לא נבחר דבר" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "פרק אחד" msgstr[1] "%(count)d פרקים" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "גודל: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "ההזנה בכתובת %(url)s לא יכולה להתעדכן." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "שגיאה בפתיחת נגן" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "הוסף קבוצה" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "קבוצה חדשה:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "בחר תמונת עטיפה חדשה לפודקסט" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "אתה יכול לגרור רק תמונה אחת או כתובת אינטרנט לכאן." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "גרור ושחרר" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "אתה יכול לגרור לכאן רק קבצים מקומיים וכתובות http." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "לא הוגדר התקן" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "אנא הגדר את ההתקן שלך בחלון ההעדפות." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "לא ניתן לפתוח את ההתקן" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "אנא בדוק את ההגדרות בחלון ההעדפות." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "אין די מקום פנוי על ההתקן" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "דרוש מקום פנוי נוסף: %(required_space)s\n" "האם להמשיך?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "רשימה הועלתה בהצלחה." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "שגיאה בהמרת קובץ." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "הכל" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "הסתר פרקים שנמחקו" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "הורד" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "הועברו לארכיון" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "וידאו" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "סמן אותו כמושמע" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "הורדות שלא הושמעו" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "(%(count)d) תרומות ב־Flattr" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "תרום ב־Flattr %(count)d" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "התחבר ל־Flattr בהגדרות." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "תורם לפרק..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "לא ניתן להתחבר ל־Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "מחק" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "מעלה הרשמות..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "שגיאה בעת טעינה:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "עדכן הכל" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "עדכן" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "שנה שם" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "שנה קבוצה" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "בטל הרשמה" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "מזג פעולות פרק..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "מזג פעולות פרק (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "להסיר את הפודקסט הזה ואת הפרקים שלו?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "שם לקבוצה החדשה:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "שם חדש:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "למחוק פרק זה?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "סמן כחדש" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "אפשר מחיקה" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "הוסף לתור ההשמעה" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "מוסיף פודקסטים..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "לא יכול להוסיף מספר פודקסטים" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "התחל מחדש הכל" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "רצועה לא ידועה" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s ב־Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "רצועות שפורסמו בידי %s ב־Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "המועדפים של %s ב־Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "רצועות שמועדפות בידי %s ב־Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "מוריד כתוביות עבור הרצאות של TED" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "הורדת כתובויות srt עבור סרטוני הרצאות של TED" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "המר קובצי וידאו ל־MP4 עבור Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "ממיר את כל הסרטונים לסוג שתואם ל־Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "הקובץ הומר" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "מחוון יישום של אובונטו" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "הצג את מחוון המצב בסרגל העליון." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "הצג חלון ראשי" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "יציאה" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "הצג התקדמות הורדה באיקון המשגר של Unity." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "שנה את שם הפרקים לאחר ההורדה" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "שנה בהורדה את שם הפרקים למבנה \".\"" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "ההמרה נכשלה" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "המר קובצי m4a ל־mp3 או ל־ogg באמצעות ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "המר ל־%(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "ההמרה נכשלה" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "הסר תמונת עטיפה מקובצי OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "מסיר את תמונת העטיפה מכל קובצי ogg שהורדו" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "הסר תמונת עטיפה" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "בדוק אם ישנם פרקים חדשים בהפעלה" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "בדוק אם ישנם פרקים חדשים בהפעלה" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "נרמל שמע באמצעות קידוד מחדש" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "נרמל את עצמת קובצי השמע באמצעות normalize-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "הקובץ נורמל" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 #, fuzzy msgid "Show a status icon for Gtk-based Desktops." msgstr "הצג את מחוון המצב בסרגל העליון." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "מזער בהפעלה" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "ממזער את החלון של gPodder בהפעלה התכנה." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "ההמרה נכשלה" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "המר קובצי m4a ל־mp3 או ל־ogg באמצעות ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "תייג באמצעות Mutagen קבצים שהורדו" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "הוסף את כותרות הפרק והפודקסט לתגי mp3/ogg" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "שילוב עם ממשק Unity של אובונטו" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "הצג התקדמות הורדה באיקון המשגר של Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "הוסף פודקסט חדש" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "כתובת:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "עורך הפודקסטים של gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "קבוצה:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "נטרל עדכוני הזנה (השהיית ההרשמה)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "כללי" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "אימות HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "שם משתמש:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "ססמה:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "מיקומים" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "הורד אל:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "אתר:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "תווית אתר" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "מתקדם" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "עורך התצורה של gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "חיפוש עבור:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "הצג הכל" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "ֹֹ_פודקסטים" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "בדוק לפרקים חדשים" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "הורד פרקים חדשים" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "העדפות" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_הרשמות" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "גלה פודקסטים חדשים" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "הוסף פודקסט מכתובת אינטרנט" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "ייבא מקובץ OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "ייצא לקובץ OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "לך אל gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "פ_רקים" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "נגן" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "פתח" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "עבור למצב חדש" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "שנה נעילת מחיקה" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "ת_וספות" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "סנכרן להתקן" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_תצוגה" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"כל הפרקים\" ברשימת הפודקסטים" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "השתמש בקבוצות ברשימת הפודקסטים" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "סרגל כלים" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "תיאור הפרק" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "הסתר פרקים שנמחקו" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "פרקים שהורדו" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "פרקים שלא הושמעו" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "הסתר פודקסטים ללא פרקים" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_עזרה" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "מדריך למשתמש" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "עדכוני תכנה" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "מסנן:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "פודקסטים" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "הגבלת קצב" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "ק״ב/שנייה" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "הגבל הורדות ל־" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "בחר פרקים" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "תחילת העבודה" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "ברוך הבא אל gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "רשימת הפודקסטים שלך ריקה." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "בחר מרשימת הפודקסטים לדוגמה" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "הוסף פודקסט על־ידי הזנת הכתובת שלו" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "שחזר את ההרשמות שלי מ־gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "נגן אודיו:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "נגן וידאו:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "הרחבות" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "תרום דרך flattr אוטומטית בהפעלת פרקים" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "סנכרן פעולות של הרשמות ופרקים" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "החלף את הרשימה שעל השרת בהרשמות המקומיות" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "שם ההתקן:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "תזמון עדכונים:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "מספר מרבי של פרקים לפודקסט:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "כשנמצאים פרקים חדשים:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "עדכונים" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "מחק פרקים שהושמעו:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "הסר פרקים שנוגנו גם אם לא הסתיימו" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "הסר גם פרקים שלא הושמעו" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "ניקוי" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "סוג ההתקן:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "נקודת עגינה:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "אחרי סנכרון פרק:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "החלף את הרשימה בשרת" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "רשימת ההשמעה ריקה" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "סנכרן פרקים שלא הושמעו בלבד" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "התקנים" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "ערוך תצורה" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "מצא פודקסטים חדשים" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "בחר הכל" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "אל תבחר כלום" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "OPML/_חפש" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "פודקסטים _מובילים" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "מושמע כעת" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "מוסיף פודקסטים" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "הגדרות" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "אודות" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "תודות" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "קרדיטים" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "קרדיטים" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "שם ההתקן" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "הגדרות gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "כוונון מסך" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "סיבוב אוטומטי" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "יצירת אינדקס מדיה" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "הצג פודקסטים ביישום מוזיקה" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "תרום דרך flattr אוטומטית בהפעלה" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "אפשר סנכרון" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "התחבר אל gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "החלף את הרשימה בשרת" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "אין חשבון? הרשם כאן" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "נגן תור" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "רשימת ההשמעה ריקה" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "פרטי הפרק" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "הורד פרקים" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "נגן פרקים" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "הערות" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "בחר פרקים שהורדו" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "הפוך בחירה" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "אין פודקסטים." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "הוסף עכשיו את הפודקסט הראשון שלך." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "אין פרקים" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "גע לשינוי המסנן" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "הצג פרקים" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "חפש מושג או כתובת" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "פודקסטים מומלצים" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "gpodder.net שלי" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "דוגמאות" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "מופעל על ידי gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "הרשם" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "דקה אחת" msgstr[1] "%(count)s דקות" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "שנייה אחת" msgstr[1] "%(count)s שניות" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "פורסם: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "פורסם: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "הרחבות מבקשות לעדכן פודקסט." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "הרחבות מבקשות להוריד פרק." #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "כתובת אינטרנט לא תקינה: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "אינך רשום לֹ־%s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "לא ניתן להירשם ל־%s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "לא ניתן להירשם ל־%s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s נוסף בהצלחה." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "אפשרות תצורה זו אינה קיימת." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "ניתן להגדיר רק על של צומתי תצורה." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "השם שונה מ־%(old_title)s ל־%(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "ההרשמה ל־%s בוטלה." #: bin/gpo:473 msgid "Updates disabled" msgstr "עדכונים מנוטרלים" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "פרק חדש אחד" msgstr[1] "%(count)d פרקים חדשים" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "בודק לפרקים חדשים" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "מדלג על %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "מנטרל עדכוני הזנה מ־%s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "מאפשר עדכוני הזנה מ־%s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "מאזין לכל ממשקי הרשת." #: bin/gpo:622 msgid "No podcasts found." msgstr "לא נמצאו פודקסטים." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "הזן את האינדקס להרשמה, ? בשביל רשימה" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "ערך לא חוקי." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "כתובת אינטרנט לא תקינה: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "הכתובת שונתה מ־%(old_url)s ל־%(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "שגיאת תחביר: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "פקודה דו־משמעית. האם התכוונת לאלה.." #: bin/gpo:828 msgid "The requested function is not available." msgstr "הפונקציה המבוקשת אינה זמינה." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Print debugging output to stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "הירשם לכתובת שניתנה" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "מספר תהליך של יישום Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "לקוח הפודקסטים gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "לקוח פודקסטים" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "הרשם לתוכן של שמע ווידאו מהרשת" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "המר קובצי flv מ־YouTube ל־mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "שימושי כדי לנגן סרטונים שהורדו על נגני חומרה" #~ msgid "Convert FLV to MP4" #~ msgstr "המר FLV ל־MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "המר שמע M4A ל־MP3 או ל־OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "המר קובצי m4a ל־mp3 או ל־ogg באמצעות ffmpeg" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "המר שמע M4A ל־MP3 או ל־OGG" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "הקובץ הומר" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "ההמרה נכשלה" #~ msgid "OK" #~ msgstr "אישור" #~ msgid "Please wait..." #~ msgstr "אנא המתן..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "הפעל את ממשק QML של gPodder" gpodder-3.5.2/po/id_ID.po0000644000175000017500000015115212220345607014511 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/" "gpodder/language/id_ID/)\n" "Language: id_ID\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "" #: src/gpodder/model.py:679 msgid "unknown" msgstr "" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 msgid "Episode added to playlist" msgstr "" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" gpodder-3.5.2/po/it.po0000644000175000017500000021221412220345607014152 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. # Andrea Scarpino , 2011. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-04-23 17:31+0100\n" "Last-Translator: Maurizio Ballo \n" "Language-Team: Italian (http://www.transifex.com/projects/p/gpodder/language/" "it/)\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.5.4\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder su %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d giorno fa" msgstr[1] "%(count)d giorni fa" #: src/gpodder/util.py:495 msgid "Today" msgstr "Oggi" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ieri" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(sconosciuto)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d secondo" msgstr[1] "%(count)d secondi" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d ora" msgstr[1] "%(count)d ore" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minuti" #: src/gpodder/util.py:1245 msgid "and" msgstr "e" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Annullato dall'utente" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Scrittura dei dati su disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Apertura del database dell'iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod aperto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Salvataggio del database dell'iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Scrittura avanzata del database gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Eliminazione di %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Aggiunta di %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Errore nella copia di %(episode)s: Spazio libero insufficente su " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Apertura del lettore MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Lettore MP3 aperto" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Errore nell'apertura di %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Apertura del dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s aperto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Chiusura di %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s chiuso" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Aggiunta di %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Aggiunto" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "In coda" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sincronizzazione" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Completato" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Fallito" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Annullato" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "In pausa" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Errore: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Aggiungi %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Elimina %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Non sufficiente per Flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "L'elemento non esiste su Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Elemento giò segnalato a Flattr o personale" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Richiesta non valida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Nessuna connessione internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Nessuna descrizione" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Nessuna descrizione disponibile" #: src/gpodder/model.py:679 msgid "unknown" msgstr "sconosciuto" #: src/gpodder/model.py:744 msgid "Default" msgstr "Predefinito" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Tieni solo i più recenti" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Altro" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Nome utente o password errati" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Download in corso" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Contenuti mancanti dal server" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Errore I/O: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Errore HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integrazione Desktop" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interfaccia" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Dopo il download" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Nessuna descrizione per questa estensione." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Comando non trovato: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "Necessita almeno uno dei seguenti commandi: %(list_of_commands)s" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Modulo Python non installato: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Applicazione predefinita" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Caricamento dei download incompleti" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Alcuni episodi non hanno completato il download in una precedente sessione." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d file parziale" msgstr[1] "%(count)d file parziali" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Ripristina tutti" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Trovati scaricamenti incompleti dall'ultima sessione." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Azione" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Conferma i cambiamenti da gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Seleziona le azioni da eseguire." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Caricamento delle iscrizioni" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Caricamento delle iscrizioni sul server in corso." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Elenco caricato con successo." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Errore nel caricamento" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episodio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Dimensione" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Durata" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Rilasciato" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Colonne visualizzate" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Avanzamento" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Caricamento episodi" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Nessun episodio in questa schermata" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Nessun episodio disponibile" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Nessun podcast in questa schermata" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Nessuna iscrizione" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Nessuna attività in corso" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d attivo" msgstr[1] "%(count)d attivi" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d fallito" msgstr[1] "%(count)d falliti" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d in coda" msgstr[1] "%(count)d in coda" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "download di %(count)d file in corso" msgstr[1] "download di %(count)d file in corso" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "sincronizzazione di %(count)d file" msgstr[1] "sincronizzazione di %(count)d file" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d attività in coda" msgstr[1] "%(queued)d attività in coda" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Per favore segnala questo problema e riavvia gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Eccezione non gestita" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Errore nel feed: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Impossibile scaricare alcuni podcast:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Download completati" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Download falliti" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Impossibile sincronizzare alcuni podcast:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Sincronizzazione dispositivo eseguita" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Sincronizzazione dispositivo fallita" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d di episodi" msgstr[1] "%(count)d di più episodi" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Informazioni sull'episodio" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Avvia download ora" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Scarica" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Annulla" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausa" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Rimuovi dall'elenco" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Aggiorna podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Apri la cartella dei download" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Segna episodi come vecchi" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archivia" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Elimina podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Impostazioni podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Errore nella conversione del file." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Trasferimento file via Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Anteprima" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Flusso" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Invia a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Cartella locale" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nuovo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Flattr a questo" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Stao di Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Verifica le impostazioni del tuo lettore multimediale nella schermata delle " "preferenze." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Errore nell'accesso al lettore" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Aggiunta dei podcast" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Attendi mentre i dettagli dell'episodio vengono scaricati." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Ignorata iscrizione esistente" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Hai già sottoscritto questi podcast:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Il podcast richiede autenticazione" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Effettuare il login su %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autenticazione fallita" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Rilevata ridirezione di un sito web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "L'indirizzo %(url)s viene ridiretto a %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Vuoi visitare il sito web ora?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Impossibile aggiungere alcuni podcast" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Non è stato possibile aggiungere alcuni podcast alla tua lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Sconosciuto" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Rilevata redirezione" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Sincronizzazione delle azioni sugli episodi" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Le azioni sugli episodi da gpodder.net sono state sincronizzate" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Annullamento..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Si prega di connettersi ad una rete e riprovare." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Nessuna connessione di rete" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Aggiornamento di %(count)d feed..." msgstr[1] "Aggiornamento di %(count)d feed..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Errore nell'aggiornamento di %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Impossibile aggiornare il feed su %(url)s." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Errore nell'aggiornamento del feed" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Aggiornati %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Nessun nuovo episodio" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Download di %(count)d nuovo episodio." msgstr[1] "Download di %(count)d nuovi episodi." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nuovi episodi disponibili" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nuovo episodio aggiunto all'elenco dei donwload." msgstr[1] "%(count)d nuovi episodi aggiunti all'elenco dei donwload." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nuovo episodio disponibile" msgstr[1] "%(count)d nuovi episodi disponibili" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Chiudi gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Al momento stai scaricando degli episodi. Puoi continuare i download al " "prossimo avvio di gPodder. Vuoi chiudere ora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Gli episodi sono bloccati" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Gli episodi selezionati sono bloccati. Sblocca gli episodi che vuoi " "eliminare prima di provare ad eliminarli." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Eliminare %(count)d episodio?" msgstr[1] "Eliminare %(count)d episodi?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "L'eliminazione degli episodi cancella i file scaricati." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Eliminazione episodi" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Attendi mentre gli episodi vengono eliminati." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Seleziona i più vecchi di %(count)d giorno" msgstr[1] "Seleziona i più vecchi di %(count)d giorni" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Seleziona i riprodotti" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Seleziona i terminati" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Seleziona gli episodi che vuoi eliminare:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Elimina episodi" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Nessun podcast selezionato" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Seleziona un podcast nella lista per aggiornarlo." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Errore durante il download %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Errore nel download" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Seleziona gli episodi che vuoi scaricare:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Segna come ascoltato" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Controlla se ci sono nuovi episodi più tardi." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Nessun nuovo episodio disponibile" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Login su gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Fare login per scaricare le iscrizioni." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "iscrizioni su gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Seleziona un podcast nella lista per modificarlo." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Elimina podcast" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Seleziona il podcast che vuoi eliminare." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Elimina" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Eliminazione del podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Attendi mentre il podcast viene eliminato" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Vuoi veramente eliminare questo podcast con tutti gli episodi?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Eliminazione dei podcast" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Attendi mentre i podcast vengono eliminati." #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Vuoi veramente eliminare i podcast selezionati con tutti gli episodi?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Seleziona un podcast nella lista per eliminarlo." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "File OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importa da OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importa podcast da file OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Niente da esportare" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "La tua lista delle iscrizioni ai podcast è vuota. Iscriviti a qualcuno prima " "di provare a esportare la lista." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Esporta in formato OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d iscrizione esportata" msgstr[1] "%(count)d iscrizioni esportate" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "La tua lista dei podcast è stata esportata correttamente." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Impossibile esportare l'OPML su file. Verifica i tuoi permessi." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Esportazione OPML fallita" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Nessun aggiornamento disponibile" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Hai la versione più recente di gPodder" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nuova versione disponibile" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Installata versione: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versione più recente: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Data di rilascio: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Scaricare l'ultima versione da gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Info su gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donazione" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Segnala un problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "traduttore ultima versione 3.5.1 \n" "Maurizio Ballo \n" "email: xmaurizio.13@hotmail.com\n" "\n" "traduttori versioni precedenti:\n" "Floriano Scioscia\n" "Fabio Fiorentini\n" "Antonio Roversi\n" "FFranci72 " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traduzioni in Italiano:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Grazie a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Seleziona un episodio dalla lista per mostrare le note." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Nessun episodio selezionato" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Impossibile avviare gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Errore D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "da %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Intero" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "In virgola mobile" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Stringa" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Accedi" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Flattr eseguito" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "Data di rilascio %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "riprodotto" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "non riprodotto" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "oggi" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "scaricati %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Eliminato" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nuovo episodio" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episodi scaricati" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episodi video scaricati" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Immagine scaricata" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "File scaricato" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "file mancante" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "mai mostrato" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "mai ascoltato" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "mai aperto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "mostrato" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "aperto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "eliminazione impedita" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Tutti gli episodi" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "da tutti i podcast" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Sottoscrizione sospesa" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Niente da incollare." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Gli appunti sono vuoti" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nome utente" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Nuovo utente" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Login" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autenticazione richiesta" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Password" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Selezionare la destinazione" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Impostazione" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Imposta a" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Impossibile impostare %(field)s a %(value)s. Tipo di dato richiesto: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Errore nell'impostazione dell'opzione" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Non fare nulla" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostra la lista degli episodi" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Aggiungi alla lista dei download" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Scarica subito" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Nessuno" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Basato su filesystem" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Segna come ascoltato" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Elimina da gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Errore" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Personalizza (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nome" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Durata" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Info modulo estensione" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Accedi con Flattr e Support Publishers" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Accedi a Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Accesso eseguito come %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Disconnetti" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "L'integrazione a Flattr richiede WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk non trovati" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Impossibile attivare l'estensione" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Info modulo estensione" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configura lettore audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configura lettore video:" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "dopo %(count)d giorno" msgstr[1] "dopo %(count)d giorni" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Sostituisci la lista delle iscrizioni sul server" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "I podcast remoti che non sono stati aggiunti in locale saranno eliminati dal " "server. Continuare?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Seleziona una cartella per il montaggio" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "Seleziona cartella per le playlist" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Cerca" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "L'indirizzo specificato non ha fornito un podcast OPML valido." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nessun feed trovato" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Non esistono canali di YouTube che corrispondono alla ricerca." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nessun canale trovato" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Seleziona tutti" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Deseleziona tutti" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nessun episodio selezionato." #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episodio" msgstr[1] "%(count)d episodi" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "dimensione: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "La cartella %s non può essere creata." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "Errore scrittura playlist" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Aggiungi sezione" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nuovo sezione:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Seleziona una nuova copertina per il podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Puoi inserire una sola immagine o indirizzo qui." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Drag & drop" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Puoi inserire solo file locali e indirizzi http:// qui." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Nessun dispositivo configurato" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Configura il tuo dispositivo nella schermata delle preferenze." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Impossibile aprire il dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Verifica le impostazioni nella schermata delle preferenze." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Non è rimasto abbastanza spazio libero sul dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "E' necessario spazio libero addizionale: %(required_space)s\n" "Vuoi continuare?" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "Aggiornamento riuscito" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "La playlist sul lettore MP3 è stata aggiornata." #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "Gli episodi sono stati cancellati dal dispositivo" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "Errore di scrittura playlist" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Tutti" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Nascondi eliminati" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Scaricati" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Archiviati" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Video" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Riprodotto parzialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Download non riprodotti" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Flattr dato (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Flattr a questo (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Accedi a Flattr come impostazione." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flattr all'episodio..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Impossibile accedere a Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Elimina" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Caricamento sottoscrizioni..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Errore caricando:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Aggiorna tutti" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Aggiorna" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Rinomina" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Cambia sezione" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Elimina iscrizione" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Sincronizzazione azioni episodio..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Sincronizzazione azioni episodio (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Eliminare questo podcast e gli episodi?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nuovo nome sezione:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nuovo nome:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Eliminare questo episodio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Segna come nuovo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Consenti eliminazione" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Metti in coda come da riprodurre" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Aggiunta podcast..." #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "Impossibile aggiungere alcuni podcast: " #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Riprendi" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Traccia sconosciuta" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s su Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Tracce pubblicate da %s su Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "I preferiti di %s su Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Tracce preferite di %s su Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Scarica sottotitoli per TED Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Scarica sottotitoli con estensione .str per video TED Talks" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Converti file video in MP4 per Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Converti tutti i video in un formato compatibile con Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "File convertito" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicatore Applicazione Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Mostra indicatore di stato nella barra in alto." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostra finestra principale" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Esci" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "Mostra progresso dei download nella barra" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "Visualizza avanzamento nella barra di Windows." #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Rinomina episodi dopo il download" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" "Rinomina episodi in \".\" dopo il download" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "Converti file video" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "Codifica in file video avi/mp4m4v " #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Converti in %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Conversione non riuscita" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Rimuovi copertina dai file OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Rimuovi la copertina da tutti i download dei file ogg" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Rimuovi copertina" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Metti in coda nel lettore multimediale" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Aggiungi al menù contestuale del lettore riferimento agli episodi in coda" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Accoda a" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "All'avvio cerca nuovi episodi" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "All'avvio esegui la ricerca di nuovi episodi" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizza audio tramite ricodifica" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Livella il volume dei file audio con normalizzatore-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "File normalizzato" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Icona di stato Gtk" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Mostra un'icona di stato per i desktop basati su Gtk." #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "Invia a Sonos" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "Invia streaming podcast ad altoparlanti Sonos" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizzza all'avvio" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimizzza la finestra di gPodder all'avvio." #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "Converti file audio" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "Codifica in file audio mp3/ogg " #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Tagga i file scaricati utilizzando Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Aggiungi i titoli degli episodi e podcast ai tag MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Unità d'Integrazione Ubuntu" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Mostra progresso dei download nell'icona." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Aggiung un nuovo podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Indirizzo:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor dei Podcast di gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sezione:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Disabilita aggiornamento dei feed (sottoscrizione sospesa)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sincronizza con lettori MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Strategia: " #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Generale" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticazione HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nome utente:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Password:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Posizioni" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Scarica in:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sito Web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etichetta del sito" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avanzato" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor della Configurazione di gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Cerca:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostra Tutto" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Cerca nuovi episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Scarica nuovi episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferenze" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "I_scrizioni" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Trova nuovi podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Aggiunta di podcast tramite URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importa da file OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Esporta su file OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Vai su gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Riproduci" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Apri" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Cambia stato Nuovo/Riprodotto" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Modifica blocco di cancellazione" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtra" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizza con il dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Visualizza" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Tutti gli episodi\" nella lista degli episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usa le sezioni per la lista dei podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra degli Strumenti" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descrizioni degli episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Nascondi episodi eliminati" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episodi scaricati" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episodi non riprodotti" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Nascondi podcast senza episodi" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Aiuto" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manuale utente online" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Aggiornamento programma" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limita la velocità a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limita gli scaricamenti a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Seleziona episodi" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Operazioni iniziali" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Benvenuto in gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "La tua lista dei podcast è vuota." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Scegli da una lista di podcast d'esempio" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Aggiungi un podcast tramite il suo URL " #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Ripristina le mie sottoscrizioni da gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Riproduttore audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Riproduttore video:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Formato video preferito: " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Estensioni" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Esegui Flattr all'episodio dopo la riproduzione automaticamente." #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizza le iscrizioni e le azioni sugli episodi" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Sostituisci la lista sul server con le iscrizioni in locale" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nome del dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervallo di aggiornamento:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Massimo numero di episodi per podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Quando vengono trovati nuovi episodi:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Aggiornamento" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Elimina gli episodi riprodotti:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Elimina episodi riprodotti anche se non del tutto" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Elimina anche gli episodi non riprodotti" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Pulizia" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo di dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Mountpoint:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Dopo la sincronizzazione di un episodio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "Crea playlist sull'unità " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "Cartella Playlist: " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "Elimina da gPodder gli episodi cancellati sul dispositivo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Sincronizza solo gli episodi non ascoltati" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivi" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Modifica configurazione" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Trova nuovi podcast" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Seleziona Tutti" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Seleziona Nessuno" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Ricerca" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "_Podcast migliori" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "In esecuzione" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "Aggiungi podcast" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Impostazioni" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Informazioni su" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Grazie" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Crediti" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "login a gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "Credenziali" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nome dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Impostazioni di gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientazione schermo" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Rotazione Automatica" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indicizzazione media" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Visualizza podcast nell'applicazione Music" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Auto-Flattr dopo riproduzione" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Abilita sincronizzazione" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "Accesso a gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Sostituisci la lista sul server" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Nessuna account? Registrati qui" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Esegui in coda" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Playlist vuota" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Informazioni sull'episodio" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Scarica episodi" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Riproduci episodi" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Mostra note" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Selezione scaricata" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Inverti selezione" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Nessun podcast." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Aggiungi il tuo primo podcast adesso." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Nessun episodio" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Tocca per cambiare filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostra lista episodi" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Cerca termine o URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Classifica" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Il mio gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Esempi" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "fornito da gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Iscriviti" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minuti" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s secondo" msgstr[1] "%(count)s secondi" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "Tirare in giù per aggiornare" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "Rilascia per aggiornare" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Aggiornamento podcast richiesto dall'estensione." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Download dell'episodio richiesto dall'estensione." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "URL non valido: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Non hai sottoscritto %s." #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "Già sottoscritto a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Impossibile sottoscrivere %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "Aggiunto con successo %s." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Questa opzione di configurazione non esiste." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Puoi solo impostare la configurazione dei nodi." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Renaminati %(old_title)s in %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Elimina sottoscrizione da %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Aggiornamenti disabilitati" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d episodio nuovo" msgstr[1] "%(count)d episodi nuovi" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Ricerca nuovi episodi..." #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Salta %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Disalita aggiornamenti feed da %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Abilita addiornamenti feed da %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Ascolto di TUTTE le interfacce di rete." #: bin/gpo:622 msgid "No podcasts found." msgstr "Nessun podcast trovato." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Inserire indice da sottoscrivere, ? per la lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valore non valido" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL non valido: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "Cambiato URL da %(old_url)s in %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Errore di Sintassi: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "Comando ambiguo. Si ntendeva..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "La funzione richiesta non è disponibile." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "Stampa dati di login sulla console" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "usa MeeGo 1.2 Harmattan UI basato su QML" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "Sottoscrivi feedi all' URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Numero processo applicazione di Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Client per Podcast gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Lista Podcast" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Sottoscrivere contenuti audio e video da internet" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Converti i file .flv di Youtube in .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "Tile per la riproduzione dei video scaricati sui lettori" #~ msgid "Convert FLV to MP4" #~ msgstr "Convert FLV in MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Converti audio M4A in MP3 o OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Transcodifica file .mp4 in .mp3 o .ogg utilizzanzo ffmpeg" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "Converti audio M4A in MP3 o OGG" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "File convertito" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Conversione non riuscita" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Attendere per favore..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Avvia interfaccia QML di gPodder" gpodder-3.5.2/po/kk.po0000644000175000017500000023011712220345607014145 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Baurzhan Muftakhidinov , 2010,2012. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Baurzhan Muftakhidinov \n" "Language-Team: Kazakh (http://www.transifex.com/projects/p/gpodder/language/" "kk/)\n" "Language: kk\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder, %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d күн бұрын" #: src/gpodder/util.py:495 msgid "Today" msgstr "Бүгін" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Кеше" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(белгісіз)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d секунд" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d сағат" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d минут" #: src/gpodder/util.py:1245 msgid "and" msgstr "және" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Пайдаланушы болдырмаған" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Мәліметті дискіге жазу" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "iPod дерекқорын ашу" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod ашылды" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "iPod дерекқорын сақтау" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Кеңейтілген gtkpod дерекқорын жазу" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Өшіруде %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Қосуда %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "%(episode)s көшіру қатесі: %(mountpoint)s ішінде бос орын жеткіліксіз" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "MP3 плеерін ашу" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 плеері ашылды" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "%(filename)s ашу қатесі: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP құрылғысы" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "MTP құрылғысын ашу" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s ашылды" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Жабу %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s жабылды" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Қосылуда %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Қосылған" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Кезекте" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Синхрондалу" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Аяқталған" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Сәтсіз аяқталды" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Бас тартылған" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Аялдатылған" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Қате: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Қосу %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Өшіру %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Қате сұраным" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Интернетпен байланыс жоқ" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Анықтамасы жоқ" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Анықтамасы жоқ" #: src/gpodder/model.py:679 msgid "unknown" msgstr "белгісіз" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Басқа" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Видео" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Аудио" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Қате тіркелгі/пароль" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Жүктелуде" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Серверден құрама жоқ" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Е/Ш қатесі: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP қатесі %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Ubuntu Unity интеграциясы" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Бүтін сан" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Жүктемені аялдату" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Бұл кеңейту үшін симаттамасы жоқ." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Команда табылмады: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Python модулі табылмады: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Команда: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Негізгі қолданба" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Толық емес жүктемелерді алу" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Алдындағы сессияда кейбір жүктемелер аяқталмаған." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d толық емес файл" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Барлығын жалғастыру" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Алдындағы сессиядан қалған аяқталмаған жүктемелер бар." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Әрекет" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "gpodder.net-тен өзгерістерді растаңыз" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Орындау үішн әрекетті таңдаңыз." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Жазылуларды жүктеу" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Жазылуларыңыз серверге жүктелуде." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Тізім сәтті жүктелді." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Жүктеу кезінде қате кетті" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Эпизод" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Өлшемі" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Ұзақтығы" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Шыққан" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Көрінетін бағандар" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Барысы" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Эпизодтар жүктелуде" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Ағымдағы көріністе эпизодтар жоқ" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Қолжетерлік эпизодтар жоқ" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Бұл көріністе подкасттар жоқ" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Жазылулар жоқ" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Белсенді тапсырмалар жоқ" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d белсенді" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d сәтсіз" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d кезекте" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "%(count)d файл жүктелуде" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "%(count)d файлды синхрондау" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d тапсырма кезекте" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Осы ақаулық жөнінде хабарлап, gPodder-ді қайта қосыңыз:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Басқарылмайтын төтеншелік" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Таспа өңдеуіш қатесі: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Кейбір эпизодтарды жүктеп алу мүмкін емес:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Жүктемелер аяқталған" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Жүктемелер сәтсіз" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Кейбір эпизодтарды синхрондау мүмкін емес:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Құрылғы синхронизациясы аяқталды" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Құрылғы синхронизациясы сәтсіз аяқталды" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "тағы %(count)d эпизод" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Эпизод ақпараты" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Жүктеп алуды қазір бастау" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Жүктеп алу" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Бас тарту" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Аялдату" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Тізімнен өшіру" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Подкастты жаңарту" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Жүктемелер бумасын ашу" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Эпизодтарды ескі деп белгілеу" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Архив" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Подкастты өшіру" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Подкаст баптаулары" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Файлды түрлендіру қатемен аяқталды." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth файлдармен алмасу" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Алдын-ала қарау" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Ағын" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Жіберу" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Жергілікті бума" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth құрылғысы" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Жаңа" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Баптаулар терезесіндегі медиа плеер баптауларын тексеріңіз." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Плеерді ашу сәтсіз" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Подкасттар қосылуда" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Эпизод ақпараты жүктелгенше күте тұрыңыз." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Бар болып тұрған жазылу ескерілмеді" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Сіз келесі подкасттарға жазулы тұрсыз:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Подкаст аутентификацияны сұрап тұр" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "%s сайтына кіріңіз:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Аутентификация сәтсіз" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Веб сайт қайта бағдарлауы анықталды" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "%(url)s URL-ы %(target)s бағдарлап тұр." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Веб сайтқа өтуді қазір қалайсыз ба?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Кейбір подкасттарды қосу мүмкін емес" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Кейбір подкасттарды тізіміңізге қосу мүмкін емес:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Белгісіз" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Қайта бағдарлау анықталды" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Эпизод әрекеттерін біріктіру" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "gpodder.net-тен эпизод әрекеттері біріктірілді." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Бас тарту..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Жаңа аты:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "%(count)d таспа жаңартылуда..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Жаңарту қатесі %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "%(url)s адресіндегі таспаларды жаңарту мүмкін емес." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Таспаны жаңарту сәтсіз" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Жаңартылған %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Жаңа эпизодтар жоқ" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "%(count)d жаңа эпизод жүктелуде." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Жаңа эпизодтар бар" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d жаңа эпизод жүктемелер тізіміне қосылды." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d жаңа эпизод бар" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "gPodder-дан шығу" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Қазір жүктеліп жатқан эпизодтар бар. Жүктемелерді gPodder келесі қосылғанда " "жалғастыра аласыз. Шығуды қалайсыз ба?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Эпизодтар блокталған" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Таңдалған эпизодтар блокталған болып тұр. Өшіру үшін оларды блоктаудан " "босатыңыз." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "%(count)d эпизодты өшіру керек пе?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Эпизодтарды өшіру жүктелінген файлдарды да өшіреді." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Эпизодтарды өшіру" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Эпизодтар өшірілгенше күте тұрыңыз" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "%(count)d күннен ескісін таңдау" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Ойналғанды таңдау" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Аяқталғанды таңдау" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Өшіргіңіз келетін эпизодтарды таңдаңыз:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Эпизодтарды өшіру" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Подкаст таңдалмады" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Жаңарту үшін тізімнен подкастты таңдаңыз." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Жүктеу қатесі %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Жүктеп алу қатесі" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Жүктегіңіз келетін эпизодтарды таңдаңыз:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Ескі деп белгілеу" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Жаңа эпизодтарды кейін тексеріңіз." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Жаңа эпизодтар жоқ" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Gpodder.net сайтына кіру" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Жазылуларыңызды жүктеп алу үшін сайтқа кіріңіз." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Gpodder.net-гі жазылулар." #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Подкасттар тізімінен түзету үшін біреуін таңдаңыз." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Подкаст" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Подкасттарды өшіру" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Өшіргіңіз келетін подкастты таңдаңыз." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Өшіру" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Подкасттар өшірілуде" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Подкаст өшірілгенше күте тұрыңыз" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Осы подкаст пен оның бар эпизодтарын өшіруді шынымен қалайсыз ба?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Подкасттарды өшіру" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Подкасттар өшірілгенше күте тұрыңыз" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Таңдалған подкаст пен оның барлық эпизодтарын өшіруді шынымен қалайсыз ба?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Подкасттар тізімінен өшіру үшін біреуін таңдаңыз." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML файлдары" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "OPML файлынан импорттау" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Подкасттарды OPML файлынан импорттау" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Экспортталатын ешнәрсе жоқ" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Сіздің подкасттар тізіміңіз бос. Экспорттау алдында бірнеше подкастқа " "жазылуыңыз керек." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "OPML файлына экспорттау" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d жазылу экспортталды" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Сіздің подкасттар тізіміңіз сәтті экспортталды." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "OPML файлға экспорты сәтсіз. Рұқсаттарыңызды тексеріңіз." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML экспорты сәтсіз" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Жаңартулар жоқ" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Сізде gPodder-дің ең жаңа нұсқасы орнатылған." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Жаңа нұсқасы қолжетерлік" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Орнатылған нұсқасы: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Жаңалау нұсқасы : %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Шығарылым күні: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "gpodder.org сайтынан соңғы нұсқасын жүктеп алу керек пе?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "gPodder туралы" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Ақшалай көмектесу / Тілектер" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Ақаулық жөнінде хабарлау" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Baurzhan Muftakhidinov 2010" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Аударған:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Рахмет:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Ақпаратын қарау үшін эпизодтың біреуін таңдаңыз." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Эпизод таңдалмады" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "gPodder қосу мүмкін емес" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus қатесі: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "қайдан: %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Бүтін сан" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Қалқымалы сан" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolean" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "String" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Кіру" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "%s шыққан" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "ойналған" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "ойналмаған" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "бүгін" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "жүктелген %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Өшірілген" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Жаңа эпизод" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Жүктеліп алынған эпизод" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Жүктеліп алынған видео эпизод" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Жүктеліп алынған сурет" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Жүктеліп алынған файл" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "файл жоқ" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "бұрын көрсетілмеген" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "бұрын ойналмаған" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "бұрын ашылмаған" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "көрсетілген" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "ашылған" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "өшіруге рұқсат жоқ" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Барлық эпизодтар" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "барлық подкасттардан" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Жазылу аялдатылды" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Кірістіру үішн ешнәрсе жоқ." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Алмасу буфері бос" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Пайдаланушы аты" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Жаңа пайдаланушы" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Кіру" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Аутентификация керек" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Пароль" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Орнын көрсетіңіз" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Баптама" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Мәнге орнату" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "%(field)s қазір %(value)s мәніне орнату мүмкін емес. Керек ақпарат түрі: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Опцияны орнату сәтсіз" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Ешнәрсе жасамау" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Эпизод тізімін көрсету" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Жүктемелер тізіміне қосу" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Қазір жүктеп алу" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ешнәрсе" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Файлдық жүйеге негізделген" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Ойналған етіп белгілеу" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "gPodder-ден өшіру" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Қате" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Таңдауыңызша пішімді жолдар" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Аты" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Ұзақтығы" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Кеңейту модулінің ақпараты" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "%(username)s ретінде кірдіңіз" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Шығу" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Flattr интеграциясы WebKit/Gtk талап етеді." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk табылмады" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Кеңейтуді белсендіру мүмкін емес" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Кеңейту модулінің ақпараты" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Аудио плеерді баптау" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Команда:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Видео плеерді баптау" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "қолмен" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "%(count)d күннен кейін" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Сервердегі тізімді алмастыру" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Жергілікті қосылмаған подкасттар серверден де өшіріледі. Жалғастырамыз ба?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Тіркеу нүктесі үшін буманы таңдаңыз" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Тіркеу нүктесі үшін буманы таңдаңыз" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Іздеу" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Көрсетілген URL ішінде дұрыс OPML подкаст адресі жоқ." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Таспалар табылмады" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Сұрауыңызға сәйкес келетін YouTube арналары табылмады." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Арналар табылмады" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Барлығын таңдау" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Ештеңе таңдамау" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ешнәрсе таңдалмады" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d эпизод" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "өлшемі: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "%(url)s адресіндегі таспаларды жаңарту мүмкін емес." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Плеерді ашу сәтсіз" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Санатты қосу" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Жаңа санат:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Подкаст үшін жаңа сыртын таңдаңыз" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Осында тек бір сурет не URL әкеліп тастай аласыз," #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Ұстап апару мен тастау" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Осында тек жергілікті файлдарды мен http:// URL әкеліп тастай аласыз." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Құрылғылар бапталмады" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Баптаулар терезесінде құрылғыңызды баптаңыз." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Құрылғыны ашу мүмкін емес" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Баптаулар терезесіндегі баптауларды тексеріңіз." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Құрылғыда бос орын қалмады" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Қосымша бос орын керек: %(required_space)s\n" "Жалғастыруды қалайсыз ба?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Тізім сәтті жүктелді." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Файлды түрлендіру қатемен аяқталды." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Барлығы" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Өшірілгенді жасыру" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Жүктелген" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Архивтелген" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Видеолар" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Жартылай ойналған" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Ойналмаған жүктемелер" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "%(count)d күннен кейін" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "%(count)d күннен кейін" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Баптаулар ішінде Flattr-ге кіріңіз." #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Эпизодтарды өшіру" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Flattr-ге кіру мүмкін емес." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Өшіру" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Жазылуларды жүктеу..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Жүктеу қатесі:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Барлығын жаңарту" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Жаңарту" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Атын ауыстыру" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Секцияны ауыстыру" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Жазылудан бас тарту" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Эпизод әрекеттерін біріктіру..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Эпизод әрекеттерін біріктіру (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Бұл подкаст пен оның эпизодтарын өшіру керек пе?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Жаңа секцияның аты:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Жаңа аты:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Бұл эпизодты өшіру керек пе?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Жаңа деп белгілеу" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Өшіруге рұқсат ету" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Ойнату кезегіне қою" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Подкасттарды қосу..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Кейбір подкасттарды қосу мүмкін емес" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Жалғастыру" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Белгісіз трек" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s Soundcloud-та" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Soundcloud-ғы %s жариялаған тректер." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s Soundcloud-тағы таңдамалылары" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "%s Soundcloud-та таңдамалы етіп белгілеген тректер." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Rockbox үшін видео файлдарды MP4-ке түрлендіру" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Барлық файлдарды Rockbox-пен үйлесімді пішімге түрлендіру" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Файл түрлендірілді" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu App индикаторы" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Үстіңгі панелде қалып-күй индикаторын көрсету." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Басты терезені көрсету" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Шығу" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Unity Launcher таңбашасында жүктеп алу үрдісін көрсету." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Жүктеп алынғаннан кейін эпизодтар аттарын ауыстыру" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" "Жүктеп алу кезінде эпизодтарды \"<Эпизод атауы>.<кеңейтуі>\" етіп атын " "ауыстыру" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Түрлендіру сәтсіз аяқталды" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr ".m4a файлдарын ffmpeg көмегімен .mp3 не .ogg пішімдеріне түрлендіру" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "%(format)s пішіміне түрлендіру" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Түрлендіру сәтсіз аяқталды" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "OGG файлдарынан альбом мұқабаларын алып тастау" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Альбом мұқабаларын алып тастау" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Қосылғанда жаңа эпизодтарға тексеру" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Қосылғанда жаңа эпизодтарға тексеру" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Файл аты" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Gtk қалып-күй таңбашасы" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Gtk-негізіндегі жұмыс үстелдері үшін қалып-күй таңбашасын көрсету" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Іске қосылған кезде, трейге жинау." #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Іске қосылған кезде, gPodder терезесін трейге жасырады." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Түрлендіру сәтсіз аяқталды" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr ".m4a файлдарын ffmpeg көмегімен .mp3 не .ogg пішімдеріне түрлендіру" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Подкаст тізімінде \"Барлық эпизодтар\" көрсету" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ubuntu Unity интеграциясы" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Unity Launcher таңбашасында жүктеп алу үрдісін көрсету." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Жаңа подкастты қосу" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL-ы:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder подкаст түзетушісі" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Секция:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Таспа жаңартуын сөндіру (жазылуды аялдату)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Плеерге синхрондау" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Өшіру саясаты:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Жалпы" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP аутентификация" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Пайдаланушы аты:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Пароль:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Орналасуы" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Сақталатын орны:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Веб сайт:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "веб сайт белгісі" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Кеңейтілген" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder баптаулар түзетушісі" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Іздеу:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Барлығын көрсету" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "Подка_сттар" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Жаңа эпизодтарға тексеру" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Жаңа эпизодтарды жүктеп алу" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Баптаулар" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "Жаз_ылулар" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Жаңа подкасттарды ашу" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Подкастты URL-дан қосу" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "OPML файлынан импорттау" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "OPML файлына экспорттау" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gpodder.net сайтына өту" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Эпизодтар" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Ойнату" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Ашу" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Жаңа күйін ауыстыру" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Блоктауды ауыстыру" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Құрылғыға синхрондау" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Түрі" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "Подкасттар тізіміндегі \"Барлық эпизодтар\"" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Подкасттар тізімі үшін секцияларды қолдану" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Панель" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Эпизодтар анықтамалары" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Өшірілген эпизодтарды жасыру" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Жүктелген эпизодтар" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Ойналмаған эпизодтар" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Эпизодтары жоқ подкасттарды жасыру" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Кө_мек" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Пайдаланушы құжаттамасы" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "БҚ жаңартулары" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Сүзгі:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Подкасттар" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Жылдамдық шегі" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "КБ/с" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Жүктемелер сан шегі" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Эпизодтарды таңдау" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Бастау үшін" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "gPodder-ге қош келдіңіз" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Сіздің подкасттар тізіміңіз бос." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Үлгі подкасттар тізімінен таңдаңыз" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Подкастты оның сілтемесін енгізу арқылы қосыңыз" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Менің жазылуларымды gpodder.net сайтынан қалпына келтіру" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Аудио плеер:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Видео плеер:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Кеңейтулер" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Әрқашан жаңа эпизодтарды авто жүктеп алу" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Жазылулар мен эпизод әрекеттерін синхрондау" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Сервердегі тізімді жергілікті нұсқасымен алмастыру" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Құрылғы атауы:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Жаңарту мерзімі:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Подкаст үшін максималды эпизодтар саны:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Жаңа эпизодтар табылған кезде:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Жаңарту" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Ойналған эпизодтарды өшіру:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Аяқталмаған болса да ойналған эпизодтарын өшіру" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Осығанқоса ойналмаған эпизодтарды өшіру" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Тазарту" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Құрылғы түрі:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Тіркеу нүктесі:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Эпизодты синхрондағаннан кейін:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Сервердегі тізімді алмастыру" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Ойнату тізімі бос" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Тек ойналмаған эпизодтарды синхрондау:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Құрылғылар" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Баптауды түзету" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Жаңа подкасттарды іздеу" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Барлығын таңдау" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Ештеңе таңдамау" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "OPML/І_здеу" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Әй_гілі подкасттар" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "YouTube-тан із_деу" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Қазір ойналуда" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Подкасттар қосылуда" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Баптаулар" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Осы туралы" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Рахмет" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Авторлар" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Авторлар" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Құрылғы аты" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "gPodder баптаулары" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Экран бағдарлауы" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Автоматты бұру" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Бұл көріністе подкасттар жоқ" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Ойнауды жалғастыру" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Синхронизацияны іске қосу" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Gpodder.net сайтына кіру" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Сервердегі тізімді алмастыру" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Тіркелгіңіз жоқ па? Осында тіркеліңіз" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Ойнату кезегі" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Ойнату тізімі бос" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Эпизод ақпараты" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Эпизодтарды жүктеп алу" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Эпизодты ойнау" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Ақпараты" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Жүктеп алынғанды таңдау" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Таңдауды терістеу" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Подкасттар жоқ." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Бірінші подкастты қосыңыз." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Эпизодтар жоқ" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Фильтрді өзгерту үшін тиіңіз" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Эпизодтарды көрсету" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Сөз не URL іздеу" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Топтізімі" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Менің gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Мысалдар" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "gpodder.net мүмкін қылған" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Жазылу" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s минут" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s секунд" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "шығарылған: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "шығарылған: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Подкастты жаңарту кеңейтулермен сұралған." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Эпизодты жүктеп алу кеңейтулермен сұралған." #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Қате URL: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Сіз %s үшін жазылған жоқсыз." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "%s үшін жазылу мүмкін емес." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "%s үшін жазылу мүмкін емес." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s сәтті қосылды." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Баптаулар опциясы жоқ." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Ескі %(old_title)s аты жаңа %(new_title)s атына өзгертілді." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "%s үшін жазылу өшірілді." #: bin/gpo:473 msgid "Updates disabled" msgstr "Жаңартулар сөндірулі." #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d жаңа эпизод" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Жаңа эпизодтарға тексеру" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "%(podcast)s аттап кету" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "%s үшін таспа жаңартуын сөндіру." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "%s үшін таспа жаңартуын іске қосу." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "БАРЛЫҚ желілік интерфейстерінен тындау." #: bin/gpo:622 msgid "No podcasts found." msgstr "Подкасттар табылмады." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Жазылу үшін нөмірді енгізіңіз, тізім үшін ?" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Мәні қате." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Қате URL: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL ескі %(old_url)s мәнінен жаңа %(new_url)s мәніне өзгертілді." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Синтаксис қатесі: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Команда қате. Мүмкін, келесіні енгізгіңіз келген шығар..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "Сұралған функция қолжетерсіз." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Жөндеу ақпаратын шығысқа шығару" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Берілген URL-ге жазылу" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X қолданбасы үрдісінің номері" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder подкасттар клиенті" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Подкасттар клиенті" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Вебтен аудио мен видео құрамасына жазылу" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "YouTube-тан алынған .flv файлдарын .mp4 пішіміне түрлендіру" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Жүктеліп алынған видеоларды құрылғылық плеерлерде ойнатқанда пайдалы" #~ msgid "Convert FLV to MP4" #~ msgstr "FLV MP4 етіп түрлендіру" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "M4A аудиосын MP3 не OGG етіп түрлендіру" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr ".m4a файлдарын ffmpeg көмегімен .mp3 не .ogg пішімдеріне түрлендіру" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "M4A аудиосын MP3 не OGG етіп түрлендіру" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Файл түрлендірілді" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Түрлендіру сәтсіз аяқталды" #~ msgid "OK" #~ msgstr "ОК" #~ msgid "Please wait..." #~ msgstr "Күте тұрыңыз..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "gPodder-дің QML интерфейсін іске қосу" gpodder-3.5.2/po/messages.pot0000644000175000017500000015162612220345607015542 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "" #: src/gpodder/model.py:679 msgid "unknown" msgstr "" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 msgid "Episode added to playlist" msgstr "" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" gpodder-3.5.2/po/nb.po0000644000175000017500000020240312220345607014134 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jim Nygård , 2009, 2011, 2012. # Thomas Perl , 2006. # Torstein Adolf Winterseth , 2010. # Torstein Adolf Winterseth , 2010. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/gpodder/" "language/nb/)\n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder på %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dag siden" msgstr[1] "%(count)d dager siden" #: src/gpodder/util.py:495 msgid "Today" msgstr "Idag" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Igår" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(ukjent)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekund" msgstr[1] "%(count)d sekunder" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d time" msgstr[1] "%(count)d timer" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minutt" msgstr[1] "%(count)d minutter" #: src/gpodder/util.py:1245 msgid "and" msgstr "og" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Avbrutt av bruker" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Skriver data til harddisken" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Åpner iPod database" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod åpnet" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Lagrer iPod database" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Skriver eksisterende gtkpod database" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Fjerner %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Legger til %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "Kan ikke kopiere %(episode)s: Ikke nok plass på %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Åpner MP3-spiller" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3-spiller åpnet" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Klarte ikke å åpne %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-enhet" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Åpner MTP-enhet" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s åpnet" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Lukker %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s lukket" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Legger til %s …" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Lagt til" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "I kø" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synkronisering" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Ferdig" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Feilet" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Avbrutt" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pauset" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Feil: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Legg til %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Fjern %s?" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 #, fuzzy msgid "Invalid request" msgstr "Ugyldig URL" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Ingen abonnement" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Ingen beskrivelse tilgjengelig" #: src/gpodder/model.py:679 msgid "unknown" msgstr "ukjent" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Annet" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Feil brukernavn/passord" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Laster ned" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Manglende innhold fra tjener" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O feil: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP feil %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Heltall" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Pause nedlasting" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Ingen beskrivelse tilgjengelig." #: src/gpodder/extensions.py:213 #, fuzzy, python-format msgid "Command not found: %(command)s" msgstr "Fant ikke brukerkommando" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python modul «%s» er ikke installert" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Kommando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Standardprogram" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Laster ufullstendige nedlasinger" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Noen episoder ble ikke fullstendig lastet ned i forrige økt." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d uferdig fil" msgstr[1] "%(count)d uferdige filer" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Gjenoppta alle" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Det finnes ufullstendige nedlastinger fra en tidligere økt." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Handling" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Bekreft endringer fra gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Velg de handlingene du vil utføre." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Laster opp abonnementer" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Laster opp abonnementer til tjeneren." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Opplastingen er vellykket." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Det skjedde en feil under opplastingen" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episode" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Størrelse" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Varighet" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Dato" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Synlige kolonner" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Fremdrift" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Laster episoder" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Ingen episoder her" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Ingen episoder tilgjengelige" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Ingen podkaster her" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Ingen abonnement" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Ingen aktive nedlastinger" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktiv" msgstr[1] "%(count)d aktive" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d feilet" msgstr[1] "%(count)d feilet" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d i kø" msgstr[1] "%(count)d i kø" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "laster ned %(count)d fil" msgstr[1] "laster ned %(count)d filer" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Vær snill å rapporter dette problemet og start gPodder på nytt." #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Ikke håndert unntak" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Kildeparserfeil: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Klarte ikke legge til noen av podkastene" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Nedlastinger er fullført" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Nedlastinger feilet" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Klarte ikke legge til noen av podkastene" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Synkronisering ferdig." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Enheten er synkronisert" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episode til" msgstr[1] "%(count)d episoder til" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Episodedetaljer" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Begynn nedlasting nå" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Last ned" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Avbryt" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pause" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Fjern fra listen" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Oppdater podkast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Åpne nedlastingsmappen" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Merk episoder som avspilt" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arkiv" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Fjern podkaste" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podkastinnstillinger" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Feil under konvertering av fil." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Filoverføring over Blåtann" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Forhåndsvisning" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Strøm" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Send til" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokal mappe" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Blåtannenheter" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Ny" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Vennligst sjekk mediaspillerinnsillingene i innstillingsdialogen." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Klarte ikke å åpne avspiller" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Legger til podkaster" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Vennligst vent mens episodedetaljene lastes ned." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Eksisterende abonnement er hoppet over" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Du abonnerer allerede på disse podkastene:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podkasten krever autentisering" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Vennligst logg inn på %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autentisering feilet" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Omadressering av nettsiden oppdaget" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL-en %(url)s videresendes til %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Vil du besøke nettstedet nå?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Klarte ikke legge til noen av podkastene" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Noen av podkastene kunne ikke legges til i listen:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Ukjent" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Omadressering oppdaget" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Slår sammen episodehandlinger" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Episodehandlinger fra gpodder.net er slått sammen." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Avbryter …" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nytt navn:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Oppdaterer %(count)d strøm…" msgstr[1] "Oppdaterer %(count)d strømmer…" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Det skjedde en feil ved oppdatering av %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Kilden på %(url)s kunne ikke oppdateres." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Feil ved oppdatering av strøm" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Oppdatert %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Ingen nye episoder" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Laster ned %(count)d ny episode." msgstr[1] "Laster ned %(count)d nye episoder." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nye episoder er tilgjengelige" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "Lagt til %(count)d ny episode i nedlastingslisten." msgstr[1] "Lagt til %(count)d nye episoder i nedlastingslisten." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d ny episode tilgjengelig" msgstr[1] "%(count)d nye episoder tilgjengelig" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Avslutt gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Du laster ned episoder. Nedlastingene kan gjenopptas neste gang du starter " "gPodder. Vil du avslutte nå?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Episoder er låst" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "De valgte episodene er låst, vennligst lås opp de episodene du ønsker å " "slette og prøv igjen." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Slett %(count)d episode?" msgstr[1] "Slett %(count)d episoder?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Sletting av episodene fjerner de nedlastede filene." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Sletter episoder" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Vennligst vent mens episodene slettes" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Slett alle eldre enn %(count)d dag" msgstr[1] "Slett alle eldre enn %(count)d dager" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Velg avspilte" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Velg ferdige" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Velg de episodene du vil slette:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Fjern episoder" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ingen podkaster er valgt" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Vennligst velg en podkast i listen som du vil oppdatere." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Det oppstod en feil ved nedlasting av %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Feil under nedlasting" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Velg de episodene du vil laste ned:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marker som gammel" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Se etter nye episoder senere." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Ingen nye episoder er tilgjengelige" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Logg inn på gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Logg inn for å laste ned dine abonnementer." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Abonnementer på gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Vennligst velg en podkast du vil redigere." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podkast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Fjern podkaster" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Velg de podkastene du vil fjerne." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Fjern" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Fjerner podkast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Vennligst vent mens podkastene fjernes" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Er du sikker på at du vil slette denne podkasten og alle episodene?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Fjerner podkaster" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Vennligst vent mens podkastene fjernes" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Er du sikker på at du vil slette disse podkastene og alle episodene?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Vennligst velg en podkast i listen du vil fjerne." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML-filer" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importer fra OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importer podkaster fra OPML-fil" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Ingenting å eksportere" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Din abonnementsliste er tom, du må abonnere på noen podkaster før du kan " "eksportere abonnementslisten." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Eksporter til OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d abonnement eksportert" msgstr[1] "%(count)d abonnement eksportert" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Abonnementslisten er eksportert." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Klarte ikke å eksportere til OPML-fil. Vennligst sjekk dine rettigheter." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML eksport feilet" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Ingen episoder tilgjengelige" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Nye episoder er tilgjengelige" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Sletter %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "utgitt: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Last ned mine abonnement fra gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Om gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Doner/ Ønskeliste" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Rapporter et problem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Jim NygårdTorstein Adolf Winterseth " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Oversatt av:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Takk til:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Vennligst velg hvilken episode i listen du vil se detaljene til." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Ingen episode valgt" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Klarte ikke starte gPodder." #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus feil: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "fra %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Heltall" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flyttall" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolsk" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Streng" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "utgitt %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "avspilt" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "ikke avspilt" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "idag" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "Lastet ned %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Slettet" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Ny episode" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episode lastet ned" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Video lastet ned" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Bilde lastet ned" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Fil lastet ned" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "mangler fil" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "aldri vist" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "aldri avspilt" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "aldri åpnet" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "vist" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "åpnet" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "sletting ikke tillatt" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alle episoder" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "fra alle podkaster" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Abonnementer er pauset" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Ingenting å lime inn." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Utklippstavla er tom" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Brukernavn" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Ny bruker" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Logg inn" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autentisering kreves" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Passord" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Velg mål" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Innstilling" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Sett til" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Kan ikke sette %(field)s til %(value)s. Datatype %(datatype)s må brukes." #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Klarte ikke å sette valget" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Gjør ingenting" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Vis episodeliste" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Legg til for nedlasting" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Last ned nå" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ingen" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Filsystembasert" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Marker som ikke avspilt" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Slett den fra gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Feil: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Egendefinerte formatstrenger" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Varighet" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Innstillinger for lydavspiller" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Innstillinger for videoavspiller" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuell" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "etter %(count)d dag" msgstr[1] "etter %(count)d dager" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Erstatte abonnementslisten på tjeneren?" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podkaster i listen på tjeneren som ikke har abonnement lokalt vil bli " "slettet. Fortsette?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Velg mappe for monteringspunkt" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Velg mappe for monteringspunkt" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Søk" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Den angitte adressen innholder ingen gyldige OPML podkastoppføringer." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Fant ingen kilder" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Fant ingen YouTube-kanaler som samsvarer med søket." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Fant ingen kanaler" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Velg alle" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Velg ingen" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ingenting er valgt" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episode" msgstr[1] "%(count)d episoder" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "størrelse: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Kilden på %(url)s kunne ikke oppdateres." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Klarte ikke å åpne avspiller" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Handling" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nytt navn:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Velg et nytt omslagsbilde til podkasten" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Du kan bare slippe ett bilde eller en URL her." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Dra og slipp" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Du kan bare slippe lokale filer og http:// URL-er her." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Ingen enhet er konfigurert" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Vennligst sett opp mediaspilleren i innstillingsdialogen." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Klarte ikke å åpne enheten" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Vennligst sjekk innstillingene i innstillingsdialogen." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Ikke nok plass på enheten." #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Du må frigjøre %s.\n" "Vil du fortsette?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Opplastingen er vellykket." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Feil under konvertering av fil." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alle" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Ikke vis slettede episoder" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Lastet ned" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Arkiv" #: src/gpodder/qmlui/__init__.py:71 #, fuzzy msgid "Videos" msgstr "Video" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Marker som ikke avspilt" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "ikke-avpilte nedlastinger" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "etter %d dag" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "etter %d dag" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Sletter episoder" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Klarte ikke å fjerne podcast." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Slett" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Laster opp abonnementer…" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Det skjedde en feil under opplastingen" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Oppdater alle" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Oppdater" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Gi nytt navn" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Bytt gruppe" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Fjerne abonnementet" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Slår sammen episodehandlinger" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Slår sammen episodehandlinger" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Fjerne denne podkasten og alle episodene?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nytt gruppenavn:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nytt navn:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Slette denne episoden?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marker som ny" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Tillat sletting" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Lydavspiller:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Legger til podkaster…" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Klarte ikke legge til noen av podkastene" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Gjenoppta alle" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Ukjent spor" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s på Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Publiserte spor fra %s på Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%ss favoritter på Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Spor %s har markert som favoritter på Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "iPod OGG-konvertering" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Avslutt" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "En episode lastet ned:" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "En ny episoder tilgjengelig for nedlasting" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Konverterer fil" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Konverterer fil" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Hent omslagsbilde fra fil" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Merk som ikke ny" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Se etter nye episoder ved oppstart" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Se etter nye episoder ved oppstart" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Filnavn" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Statusikon" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Konverterer fil" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Vis «Alle episoder» i podkastlisten" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Legg til en ny podkast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder podkastklient" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Gruppe:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Slå av strømoppdateringer (sett i pause)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synkroniserer med spiller" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Slettemetode:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Generell" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP autentisering" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Brukernavn:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Passord:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Steder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Last ned til:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Nettside:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "nettsideetikett" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avansert" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder oppsettsendrer" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Søk etter:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Vis alle" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podkaster" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Se etter nye episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Last ned nye episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Innstillinger" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Abonnement" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Let etter nye podkaster" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Legg til podkast fra URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importer fra OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Eksporter til OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gå til gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Spill av" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Åpne" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Endre status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Endre slettelås" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Synkroniser enheten" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Vis" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Alle episoder\" i podkastlisten" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Bruk grupper i podkastlisten" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Verktøylinje" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Episodedetaljer" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ikke vis slettede episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Nedlastede episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Ikke avspilte episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Gjem podkaster uten episoder" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Hjelp" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Brukermanual" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podkaster" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Begrens hastighet til" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Begrens nedlastinger til" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Velg episoder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Innstillinger" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Velkommen til gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Abonnementslisten er tom." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Velg fra en liste med eksempelpodkaster" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Legg til podkast fra URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Last ned mine abonnement fra gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Lydavspiller:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Videoavspiller:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Alltid last ned nye episoder automatisk" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synkroniser abonnement og episodehendelser" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Erstatt listen på tjeneren med din lokale liste" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Enhetsnavn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Oppdateringsintervall: " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maks antall episoder for hver podkast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Når nye episoder er funnet:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Oppdaterer" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Fjern avspilte episoder:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Fjern avspilte episoder selv om de ikke er ferdige" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Fjern også ikke-avspilte episoder" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Rydd opp" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Enhetstype:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Monteringspunkt" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Etter synkronisering av en episode:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Erstatte abonnementslisten på tjeneren?" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Spillelistenavn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Ikke synkroniser avspilte episoder" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Enheter" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Rediger innstillinger" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Let etter nye podkaster" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Velg alle" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Velg ingen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Søk" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Topp _podkaster" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Nå spilles" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Legger til podkaster" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Innstillinger" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Om" #: share/gpodder/ui/qml/main_default.qml:168 #, fuzzy msgid "Thanks" msgstr "Takk til:" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Enhetsnavn:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "gpodder.net instillinger" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Skjermrotasjon" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Automatisk opprydding" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Ingen podkaster her" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Gjenoppta avspilling" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Etter synkronisering:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Logg inn på gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Erstatte abonnementslisten på tjeneren?" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Avspilt" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Spillelistenavn:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Episodedetaljer" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Nedlastede episoder" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Spill episode" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Episodedetaljer" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Velg nedlastingsmappe" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Inverter valgene" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Ingen podkaster" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Ingen nye episoder" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Vis episodeliste" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Søkestekst eller URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Toppliste" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Eksempler" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "drevet av gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Abonner" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minutt" msgstr[1] "%(count)s minutter" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s sekund" msgstr[1] "%(count)s sekunder" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "utgitt: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "utgitt: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Podkasten krever autentisering" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Ugyldig URL" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Du abonnerer allerede på disse podkastene:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Klarte ikke å synkronisere med iPod" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Klarte ikke å synkronisere med iPod" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Fjerne abonnementet" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Oppdater valgte" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Ser etter nye episoder …" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Hopper over podcast: %s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Leser filer fra %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Fant ingen podkaster" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 #, fuzzy msgid "Invalid value." msgstr "Ugyldig URL" #: bin/gpo:671 #, fuzzy, python-format msgid "Invalid URL: %s" msgstr "Ugyldig URL" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Denne funksjonen er ikke tilgjengelig for iPod." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Skriv avlusningsdata til stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Abonner på den angitte ULRen" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X programprosessnummer" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder podkastklient" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podkastklient" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Abonner på lyd- og videopodkaster fra nettet" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "iPod OGG-konvertering" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konverterer fil" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Vennligst vent …" #~ msgid "Start the QML interface of gPodder" #~ msgstr "Start QML-grensesnittet for gPodder" gpodder-3.5.2/po/nl.po0000644000175000017500000020122212220345610014136 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Arne Stierman , 2012. # Michiel Pater , 2012. # Pieter De Decker , 2007. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/gpodder/language/" "nl/)\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder heeft %s gevonden" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dag geleden" msgstr[1] "%(count)d dagen geleden" #: src/gpodder/util.py:495 msgid "Today" msgstr "Vandaag" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Gisteren" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(onbekend)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d seconde" msgstr[1] "%(count)d seconden" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d uur" msgstr[1] "%(count)d uren" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuut" msgstr[1] "%(count)d minuten" #: src/gpodder/util.py:1245 msgid "and" msgstr "en" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Toevoegen van %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Toegevoegd" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "In wachtrij" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Klaar" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Mislukt" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Geannuleerd" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pauze" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Fout: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Toevoegen van %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "%s verwijderen?" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Geen beschrijving beschikbaar" #: src/gpodder/model.py:679 msgid "unknown" msgstr "onbekend" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Anders" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Voer uw naam en wachtwoord in." #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Downloaden" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Ontbrekende componenten:" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Fout bij het openen van %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Fout bij het openen van %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Ubuntu Unity Integratie" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Integer" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Selecteer afleveringen" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Geen omschrijving voor deze extensie" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Commando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Standaard programma" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Laden incomplete downloads" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "De vorige keer zij sommige afleveringen niet volledig gedownload." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d gedeeltelijk bestand" msgstr[1] "%(count)d gedeeltelijke bestanden" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Hervat allen" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Onvolledige downloads van een vorige sessie gevonden." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Actie" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Download lijst van gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Selecteer de afleveringen die u nu wilt downloaden." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Uploaden abonnementen" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Uw abonnementenlijst is bijgewerkt." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lijst succesvol geüpload." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Fout tijdens uploaden" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Aflevering" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Grootte" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duur" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Uitgegeven" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Zichtbare kolommen" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Voortgang" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Downloaden van nieuwe afleveringen" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Geen afleveringen geselecteerd" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Geen afleveringen beschikbaar" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Geen podcast geselecteerd" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Geen abonnementen" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d actief" msgstr[1] "%(count)d actief" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d mislukt" msgstr[1] "%(count)d mislukt" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d in de wachtrij" msgstr[1] "%(count)d in de wachtrij" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "downloaden van %(count)d bestand" msgstr[1] "downloaden van %(count)d bestanden" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Maak a.u.b. melding van dit probleem en herstart gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Onbehandelde uitzondering" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Feedparser foutmelding: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Downloads compleet" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Downloads mislukt" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "Nog %(count)d aflevering" msgstr[1] "Nog %(count)d afleveringen" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Details aflevering" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Start download direct" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Download" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Annuleren" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pauze" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Verwijder van lijst" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Update podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Open downloadmap" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Aflevering als afgespeeld markeren" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Archiveren" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Verwijder podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast instellingen" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Fout bij conversie van bestand." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth bestandsoverdracht" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Voorvertoning" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Streamen" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Stuur naar" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokale map" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth apparaat" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nieuw" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Controleer uw mediaspeler instellingen bij Voorkeuren." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Fout bij het openen van speler" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Toevoegen van podcast" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Moment geduld a.u.b.: informatie over de aflevering wordt opgehaald." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Eén abonnement geëxporteerd" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "U bent al geabonneerd op deze podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast vereist authenticatie" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Log in op %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Authenticatie mislukt" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Website omleiding gedetecteerd" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "DE URL %(url)s verwijst naar %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Weet u zeker dat u gPodder wilt afsluiten?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "De podcast kon niet worden toegevoegd." #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Sommige podcasts konden niet toegevoegd worden aan uw lijst:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Onbekend" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Verwijzing gedetecteerd" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Verwerken aflevering acties" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Aflevering acties van gpodder.net zijn samengevoegd." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Annuleren..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Bijwerken van %(count)d feed..." msgstr[1] "Bijwerken van %(count)d feeds..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Fout tijdens updaten van %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Fout bij het openen van %(url)s" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Fout tijdens het updaten van feed" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s (%(position)d/%(total)d) bijgewerkt." #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Geen nieuwe afleveringen" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "%(count)d nieuwe aflevering gedownload." msgstr[1] "%(count)d nieuwe afleveringen gedownload." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nieuwe afleveringen beschikbaar" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nieuwe aflevering aan download lijst toegevoegd." msgstr[1] "%(count)d nieuwe afleveringen aan download lijst toegevoegd." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nieuwe aflevering beschikbaar" msgstr[1] "%(count)d nieuwe afleveringen beschikbaar" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "gPodder afsluiten" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "U bent afleveringen aan het downloaden. U kan deze hervatten de volgende " "keer dat u gPodder start. Wilt u gPodder afsluiten?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Afleveringen zijn beveiligd" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "De geselecteerde afleveringen zijn beveiligd. Verwijder de beveiliging en " "probeer het opnieuw." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "%(count)d aflevering verwijderen?" msgstr[1] "%(count)d afleveringen verwijderen?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Selecteer de podcasts die u wilt verwijderen van uw apparaat." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Afleveringen selecteren" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Wacht a.u.b terwijl de afleveringen verwijderd worden." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Ouder dan %(count)d dag" msgstr[1] "Ouder dan %(count)d dagen" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Selecteer afgespeeld" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Selecteer de aflevering die u wilt verwijderen:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Geselecteerde afleveringen verwijderen" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Geen podcast geselecteerd" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Selecteer een podcast die u wilt updaten." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Fout tijdens downloaden van: %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Fout tijdens downloaden" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Selecteer de afleveringen die u nu wilt downloaden." #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Markeer als afgespeeld" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Controleren op nieuwe afleveringen" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Geen nieuwe afleveringen beschikbaar" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Ga naar gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "U moet inloggen om uw abonnementen te downloaden" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Upload abonnementen geslaagd." #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Kies een podcast uit de abonnementenlijst om ze te bewerken." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Verwijder podcast" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Selecteer de afleveringen die u wilt verwijderen" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Verwijder" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Podcast wordt verwijderd" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Moment a.u.b. podcast wordt verwijderd" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" "Weet u zeker dat u deze podcast en alle gedownloade afleveringen wilt " "verwijderen?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Verwijderen van podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Even wachten, de podcasts worden verwijderd" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Weet u zeker dat u de geselecteerde podcasts en alle gedownloade " "afleveringen wilt verwijderen?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Selecteer een podcast in de lijst om te verwijderen" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML bestanden" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importeren van OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importeer podcasts van OPML bestand" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Niets om te exporteren" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Uw abonnementenlijst is leeg. Abonneer u eerst op een podcast voordat u uw " "abonnementenlijst exporteert." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Naar OPML exporteren" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d abonnement geëxporteerd" msgstr[1] "%(count)d abonnementen geëxporteerd" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "De export van uw lijst met podcasts is geslaagd. " #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Kan OPML niet naar bestand exporteren. Controleer uw rechten." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Exporteren naar OPML mislukt" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Geen updates beschikbaar" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Je hebt de laatste versie van gPodder" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nieuwe versie beschikbaar" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Geïnstalleerde versie: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Nieuwste versie: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Download de laatste versie van gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Over gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Verlanglijst op Amazon" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Meldt een probleem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Pieter De Decker \n" "\n" "Launchpad Contributions:\n" " Pieter De Decker \n" " Roel Groeneveld \n" " Iwan van der Kleijn " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Vertaald door:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Met dank aan:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Selecteer een aflevering om de notities te bekijken." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Niets geselecteerd" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Niet mogelijk om gPodder te starten" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus error: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "van %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Integer" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Float" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolean" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "String" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "uitgegeven %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "afgespeeld" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "niet afgespeeld" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "vandaag" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "Download %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Verwijderd" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nieuwe aflevering" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Gedownloade aflevering" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Gedownloade video aflevering" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Gedownloade afbeelding" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Gedownload bestand" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "missend bestand" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nooit weergegeven" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nooit gespeeld" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nooit geopend" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "weergegeven" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "geopend" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "verwijdering voorkomen" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alle afleveringen" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "van alle podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Abonnement gepauzeerd" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Niets om te exporteren" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Klemboard is leeg" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Gebruikersnaam" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Nieuwe gebruiker" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Login" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Authenticatie vereist" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Wachtwoord" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Kies bestemming" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Instelling" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Ingesteld op" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Kan de waarde van %(field)s niet veranderen naar %(value)s. " "Vereiste datatype: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Fout bij toepassen instelling" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Niets doen" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Afleveringen weergeven" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Voeg toe aan download lijst" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Download direct" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Naam" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duur" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Extensie module info" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Extensie kan niet worden geactiveerd" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Extensie module info" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configureer audio speler" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Opdrachtregel:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configureer video speler" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "handmatig" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "na %(count)d dag" msgstr[1] "na %(count)d dagen" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Vervang abonnementen lijst op server" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcasts op servers die niet lokaal worden toegevoegd, worden verwijderd op " "de server. Doorgaan?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Zoek naar:" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "De opgegeven URL bevat geen geldige OPML-podcast informatie." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Geen feeds gevonden" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" "Er zijn geen kanalen op YouTube welke overeenstemmen met deze zoekopdracht." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Geen feeds gevonden" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Alles selecteren" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Niets selecteren" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Niets geselecteerd" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d aflevering" msgstr[1] "%(count)d afleveringen" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "Totale grootte: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Fout bij het openen van %(url)s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Fout bij het openen van speler" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Selecteer afbeelding voor podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "U kan maar één afbeelding of URL naar hier slepen." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Slepen" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "U kan hier enkel lokale bestanden en http://-URL's naartoe slepen." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lijst succesvol geüpload." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Fout bij conversie van bestand." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alles" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Verberg verwijderd" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Gedownload" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Gearchiveerd" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Videos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "Niet gespeelde afleveringen" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Verwijder" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Uploaden van abonnementen..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Fout bij uploaden:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Alle feeds bijwerken" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Feed bijwerken" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Hernoem" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Sectie veranderen" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Abonnement opzeggen" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Samenvoegen aflevering acties" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Aflevering acties samenvoegen (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Podcast en afleveringen verwijderen?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Sectie naam:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nieuwe naam:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Geselecteerde afleveringen verwijderen" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Markeer als nieuw" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Sta wissen toe" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Voeg toe aan afspeellijst" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Podcast toevoegen..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "De podcast kon niet worden toegevoegd." #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Hervat allen" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "onbekend" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s op Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Tracks gepubliceerd door %s op Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s's favorieten op Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Favoriete tracks van %s op SoundCloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu App Indicator" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Sluiten" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Weergeef de download vooruitgang in de Unity Launcher icoon." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Hernoem afleveringen na het downloaden" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Conversie mislukt" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Conversie mislukt" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Verwijder cover art van OGG bestanden" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Verwijder cover art" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Controleren op nieuwe afleveringen" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Controleren op nieuwe afleveringen" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Bestand genormaliseerd" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Conversie mislukt" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ubuntu Unity Integratie" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Weergeef de download vooruitgang in de Unity Launcher icoon." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Voeg een podcast toe" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder - podcast bewerken" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sectie:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Stop feed updates (abonnement pauzeren)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Algemeen" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP-authenticatie" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Gebruikersnaam:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Wachtwoord:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Lokaties" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Download naar:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Website:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "websitelabel" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Geadvanceerd" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder - configuratie bewerken" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Zoek naar:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Alles tonen" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Controleren op nieuwe afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Download nieuwe afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "_Voorkeuren" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "A_bonnementen" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Nieuwe podcasts zoeken" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Podcast toevoegen via URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importeren van OPML bestand" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Naar OPML exporteren" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ga naar gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Afspelen" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Open" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Status veranderen" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Vergrendeling veranderen" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Tonen" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Alle afleveringen\" in podcast lijst" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Secties in podcastlijst gebruikten" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Werkbalk tonen" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Toon afleveringsbeschrijving" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Verberg verwijderde afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Gedownloade afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Niet gespeelde afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Verberg podcasts zonder afleveringen" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Help" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Handleiding" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Software updates" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Beperk downloadsnelheid tot" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Beperk aantal downloads tot" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Afleveringen selecteren" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Aan de slag" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Je podcast lijst is leeg" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Kies uit een lijst van voorbeeld podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "MP3-speler" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "MP3-speler" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensies" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synchroniseer abonnementen en aflevering acties" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Vervang lijst op server met lokale abonnementen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Apparaat" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Update interval:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maximum aantal afleveringen per podcast" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Wanneer er nieuwe afleveringen beschikbaar zijn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Bijwerken" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Afgespeelde afleveringen verwijderen:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" "Afgespeelde afleveringen verwijderen zelfs wanneer ze niet volledige " "beluisterd zijn" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Verwijder niet afgespeelde afleveringen" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Opruiming" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Vervang lijst op server" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Afspeellijst leeg" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Config bewerken" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Nieuwe podcasts zoeken" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Alles selecteren" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Niets selecteren" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Zoek naar:" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Top _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Speelt nu" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Toevoegen van podcast" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Instellingen" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Over" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Bedankt" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Credits" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Credits" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Apparaat" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "gPodder instellingen" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Scherm orientatie" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Automatisch draaien" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Weergeef podcasts in de Muziek app" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Synchronisatie inschakelen" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Ga naar gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Vervang lijst op server" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Geen account? Registreren" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Afspeellijst" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Afspeellijst leeg" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Details aflevering" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Download afleveringen" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Shownotes" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Selecteer afleveringen" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Geen podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Voeg je eerste podcast nu toe" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Geen aflevering" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Raak aan om filter te veranderen" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Afleveringen weergeven" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Zoekterm of URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Toplist" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mijn gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Voorbeelden" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "powered by gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 #, fuzzy msgid "Subscribe" msgstr "Abonnement opzeggen" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuut" msgstr[1] "%(count)s minuten" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s seconde" msgstr[1] "%(count)s seconden" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Ongeldige URL: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "U bent al geabonneerd op deze podcasts:" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "Succesvol toegevoegd %s." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "Updates uitgeschakeld" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d nieuwe aflevering" msgstr[1] "%(count)d nieuwe afleveringen" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "%(podcast)s overslaan" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "Geen podcasts gevonden." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Ongeldige URL: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Syntax error: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Debuguitvoer naar stdout sturen" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Kanaal importeren door opgave URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X applicatie proces nummer" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder Podcast Cliënt" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast Cliënt" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Abonneren op audio en video van het web" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Converteer .flv bestanden van YouTube naar .mp4" #~ msgid "Convert FLV to MP4" #~ msgstr "Converteer FLV to MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Converteer M4A audi to MP3 or OGG" #, fuzzy #~ msgid "Convert OGG audio to MP3" #~ msgstr "Converteer M4A audi to MP3 or OGG" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Conversie mislukt" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Even geduld..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Start de QML interface van gPodder" gpodder-3.5.2/po/nn.po0000644000175000017500000017707112220345607014164 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Thomas Perl , 2006. # Torstein Adolf Winterseth , 2010. # Torstein Adolf Winterseth , 2009, 2010. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: LANGUAGE \n" "Language: nn\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder på %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "Idag" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "I går" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(ukjend)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" msgstr[1] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "og" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Avbroten av brukar." #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Skriv data til disk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Opnar iPod-database" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod opna" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Lagrar iPod-database" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Skriv utvida gtkpod-database" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Fjernar %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Legg til %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Klarte ikkje kopiera %(episode)s: Ikkje nok ledig plass på %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Opnar MP3-spelar" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3-spelar opna" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Klarte ikkje opna %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-eining" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Opnar MTP-eining" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s opna" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Lukkar %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s lukka" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Legg til %s ..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Lagt til" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "I kø" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synkronisering" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Ferdig" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Feila" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Avbrote" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausa" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Feil: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Legg til %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Fjern %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Ingen abonnement" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Ingen detaljar tilgjengeleg" #: src/gpodder/model.py:679 msgid "unknown" msgstr "ukjend" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Andre" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Feil brukarnamn/passord" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Lastar ned" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Manglande innhald frå tenaren" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O-feil: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP-feil %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Heiltal" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Pause nedlasting" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Inga skildring tilgjengeleg." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python-modulen «%s» er ikkje installert" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Kommando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Standardprogram" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Lastar ufullstendige nedlastingar" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Somme episodar har ikkje vorte lasta ned ferdig i ei tidlegare økt." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Fortset alle" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Ufullstendige nedlastingar frå ei tidlegare økt vart funne." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Handling" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Stadfest endringar frå gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Vel handlingane du vil utføra" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Lastar opp abonnement" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Dine abonnement vert lasta opp til tenaren." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Opplastinga av liste var vellykka." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Feil under opplasting" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episode" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Storleik" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Utgjeven" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Framdrift" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Lastar episodar" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Ingen episodar her" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Ingen episodar tilgjengeleg" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Ingen podkastar her" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Ingen abonnement" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Ingen aktive nedlastingar" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Ver god og rapporter dette problemet og start gPodder på nytt:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Ikkje-handtert unntak" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Kjeldetolkarfeil: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Klarte ikkje leggja til somme podkastar" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Nedlastingar er fullførte" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Nedlastingar feila" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Klarte ikkje leggja til somme podkastar" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Eining synkronisert" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Eining synkronisert" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Episodedetaljar" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Start nedlasting no" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Last ned" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Avbryt" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pause" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Fjern frå lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Oppdater podkast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Opna nedlastingsmappe" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Merk episode som avspelt" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Fjern podkast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podkastinnstillingar" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Klarte ikkje konvertera fil." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Filoverføring via Blåtann" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Straum" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Send til" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokal mappe" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Blåtanneining" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Ny" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Sjekk mediaspelarinnstillingane dine i innstillingsdialogen." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Klarte ikkje opna spelar" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Legg til podkast" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Vent medan episodeinformasjon vert lasta ned." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Eksisterande abonnement er hoppa over" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Du abonnerer alt på desse podkastane:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podkast krev autentisering" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Logg inn til %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autentisering feila" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Nettstadsomadressering oppdaga" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "Adressa %(url)s vert omadressert til %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Vil du vitje nettstaden no?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Klarte ikkje leggja til somme podkastar" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Klarte ikkje leggja til somme podkastar til lista di:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Ukjend" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Omadressering oppdaga" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Flett saman episodehandlingar" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Episodehandlingar frå gpodder.net er fletta saman." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Avbryt …" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nytt namn:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Feil under oppdatering av %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Klarte ikkje oppdatera kjelda med adressa %(url)s" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Klarte ikkje oppdatera kjelde" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Oppdatert %(podcast)s (%(position)d / %(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Ingen nye episodar" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nye episodar tilgjengeleg" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Avslutt gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Du lastar ned episodar. Du kan fortsetja nedlastingane neste gong du startar " "gPodder. Vil du avslutta no?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Episodane er låst" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Dei valde episodane er låst. Lås opp dei episodane du vil sletta og prøv om " "att." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Sletting av episodar fjernar nedlasta filer." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Slettar episodar" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Vent medan episodane vert sletta" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Vel avspela" #: src/gpodder/gtkui/main.py:2656 #, fuzzy msgid "Select finished" msgstr "Vel ingen" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Vel episodane du vil sletta:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Slett episodar" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ingen podkastar valde" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Vel ein podkast i lista som du vil oppdatera." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Det oppstod ein feil under nedlasting av %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Nedlastingsfeil" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Vel episodane du vil lasta ned:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Merk som gammal" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Sjekk etter nye episodar seinare." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Ingen nye episodar tilgjengeleg." #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Logg inn til gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Logg inn for å lasta ned abonnementa dine." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Abonnent på gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Vel ein podkast i lista for å redigera" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podkast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Fjern podkastar" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Vel podkastane du vil sletta." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Fjern" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Fjernar podkast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Vent medan podkasten vert fjerna" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Vil du fjerna denne podkasten og alle nedlasta episodar?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Fjernar podkastar" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Vent medan podkastane vert fjerna" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Vil du fjerna denne podkasten og alle nedlasta episodar?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Vel ein podkast i lista for å fjerna." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OMPL-filer" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importer frå OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importer podkastar frå OPML-fil" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Ingenting å eksportera" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Lista di over podkastabonnement er tom. Abonner på nokre podkastar før du " "prøver å eksportera abonnementslista di." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Eksporter til OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Podkastlista di er eksportert." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Klarte ikkje eksportera til OPML-fil. Sjekk rettane dine." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Klarte ikkje eksportera OPML" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Ingen episodar tilgjengeleg" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Nye episodar tilgjengeleg" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Slettar: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "Utgjeven: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Last ned mine abonnement frå gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Avslutt gPodder" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Amazon-ønskjeliste" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Rapporter eit problem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Torstein Adolf Winterseth \n" "\n" "Send feilmeldingar og kommentarar til " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Vel kva for episode i lista du vil sjå detaljane til." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Ingen episode" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Klarte ikkje starta gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus-feil: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "Frå %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Heiltal" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flyttal" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolsk" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Streng" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "Utgjeven %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "avspela" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "ikkje spela" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "idag" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "lasta ned %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Sletta" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Ny episode" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Nedlasta episode" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Nedlasta filmepisode" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Nedlasta bilete" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Nedlasta fil" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "manglande fil" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "aldri vist" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "aldri avspela" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "aldri opna" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "vist" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "opna" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "sletting avverga" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alle episodar" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "frå alle podkastar" #: src/gpodder/gtkui/model.py:626 #, fuzzy msgid "Subscription paused" msgstr "_Abonnement" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Ingenting å lima inn." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Utklippstavle er tom" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Brukarnamn" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Ny brukar" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Logg inn" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autentisering trengst" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Passord" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Vel mål" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Innstilling" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Set til" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Klarte ikkje setja %(field)s til %(value)s. Påkravt datatype: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Klarte ikkje stilla innstilling." #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Gjer ingenting" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Vis episodeliste" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Legg til nedlasting" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Last ned no" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ingen" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Filsystembasert" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Merk som uavspelt" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Slett han frå gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Feil: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Tilpassa formatstrengar" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Set opp lydeining" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Set opp filmspelar" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuelt" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Byt ut abonnementlista på tenaren" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Eksterne podkastar som ikkje har vorte lagt til lokalt vil verta fjerna på " "tenaren. Vil du fortsetja?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Vel mappe som monteringspunkt" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Vel mappe som monteringspunkt" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Søk" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Adressa som er gjeve har ingen gjenkjende OPML-podkastfiler." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Ingen kjelder funne" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Det er ingen YouTube-kanalar som passar spørjinga." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Ingen kanalar funne" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Vel alt" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Vel ingen" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ingen vald" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "storleik: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Klarte ikkje oppdatera kjelda med adressa %(url)s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Klarte ikkje opna spelar" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Handling" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nytt namn:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Vel nytt podkastomslagsbilete" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Du kan berre sleppa eit enkelt bilete eller ei adresse her." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Dreg og slepp" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Du kan berre sleppa lokale filer og HTTP-adresser her." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Inga eining er sett opp" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Set opp eininga di i innstillingsdialogen." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Klarte ikkje opna eining" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Sjekk innstillingane i innstillingsdialogen." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Ikkje nok plass att på eininga" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Du må frigjera %s.\n" "Vil du fortsetja?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Opplastinga av liste var vellykka." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Klarte ikkje konvertera fil." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alt" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Gøym sletta episodar" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Lasta ned" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Alle episodar" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Merk som uavspelt" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "uavspela nedlasting" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "etter %d dag" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "etter %d dag" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Slettar episodar" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Slett" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Lastar opp abonnement" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Feil under opplasting" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Oppdater alle" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Oppdater alle" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Endra namn" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Inverter utval" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Fjern abonnement" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Flett saman episodehandlingar" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Flett saman episodehandlingar" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Fjern podkastane og episodane?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Nytt namn:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Nytt namn: %s" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Slett episodar" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Merk som ny" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Tillat sletting" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Lydspelar:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Legg til podkast" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Klarte ikkje leggja til somme podkastar" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Fortset alle" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Ukjent spor" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s på Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Spor publisert av %s på Soundcloud" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%ss favorittar på Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Spor favorisert av %s på Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "iPod OGG-konverterer" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Avslutt" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "Éin ny episode er klar for nedlasting" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Éin ny episode er klar for nedlasting" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Klarte ikkje konvertera fil." #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Klarte ikkje konvertera fil." #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Vel omslag frå fil" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Fjern nytt merke" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Sjå etter nye episodar under oppstart" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Sjå etter nye episodar under oppstart" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Filnamn" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Klarte ikkje konvertera fil." #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Vis «Alle episodar» i podkastliste" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Legg til ein ny podkast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Adresse:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Podkastendrar" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 #, fuzzy msgid "Section:" msgstr "Handling" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 #, fuzzy msgid "Disable feed updates (pause subscription)" msgstr "Bruk smart kjeldeoppdatering" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synkroniserer til spelar" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Slettingstrategi" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Generelt" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP-autentisering" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Brukarnamn:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Passord:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Plasseringar" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Last ned til:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Nettstad:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "nettstadsetikett" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avansert" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Innstillingsendrar" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Søk etter:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Vis alt" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podkastar" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Sjekk etter nye episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Last ned nye episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Innstillingar" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Abonnement" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Finn nye podkastar" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Legg til podkast via ei adresse" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importer frå OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Eksporter til OPML-fil" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gå til gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Spel" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Opna" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Skift slettelås" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Synkroniser til eining" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Vis" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Vis «Alle episodar» i podkastliste" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Klarte ikkje lagra podkastliste" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Vis verktøylinje" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Episodeskildringar" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Gøym sletta episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Nedlasta episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Uavspela episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Gøym podkastar utan episodar" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Hjelp" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Brukarmanual" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podkastar" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Avgrens rate til" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Avgrens nedlastingar til" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Vel episodar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Innstillingar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Velkommen til gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Podkastlista di er tom. Kva vil du gjera?" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Vel frå ei liste med dømepodkastar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Legg til podkast via ei adresse" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Last ned mine abonnement frå gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Lydspelar:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Filmspelar:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Alltid last ned nye episodar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synkroniser abonnementar og episodehandlingar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Byt ut liste på tenar med lokale abonnement" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Einingsnamn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Oppdateringsintervall:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maksimultalet på episodar per podkast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Når nye episodar er funne:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Oppdaterer" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Slett spela episodar:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Fjern spela episodar frå eining" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Fjern òg uspela episodar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Rydd opp" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Einingstype:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Monteringspunkt:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Etter ein episode er synkronisert:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Byt ut abonnementlista på tenaren" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Namn på spelelista:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Berre synkroniser uavspela episodar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Einingar" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Rediger innstillingar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Finn nye podkastar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Vel alt" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Vel ingen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Søk" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Topp _podkastar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Legg til podkast" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Innstillingar" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Om" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Einingsnamn:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "innstillingar til gpodder.net" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Visingsorientasjon" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Automatisk opprensk" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Ingen podkastar her" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Fortset avspeling" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Etter synkronisering:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Logg inn til gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Byt ut abonnementlista på tenaren" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Avspela" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Namn på spelelista:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Episodedetaljar" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Nedlasta episodar" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Spel episode" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Programnotis" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Vel nedlastingsmappe" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Inverter utval" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Ingen podkastar" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Ingen nye episodar" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Vis episodeliste" #: share/gpodder/ui/qml/Subscribe.qml:53 #, fuzzy msgid "Search term or URL" msgstr "Søk etter:" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "Dømepodkastar" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Gå til gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Abonner" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "Utgjeven: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Utgjeven: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Podkast krev autentisering" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Du abonnerer alt på desse podkastane:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Klarte ikkje synkronisera til iPod" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Klarte ikkje synkronisera til iPod" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Fjern abonnement" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Oppdater valde" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Sjekkar etter nye episodar …" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Legg til podkast" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Leser filer frå %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Ingen podkastar funne." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Denne funksjonen er ikkje tilgjengeleg for iPod-ar." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Skriv avlusningsutdata til «stdout»" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "Podkastendrar" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Podkastliste" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "iPod OGG-konverterer" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Klarte ikkje konvertera fil." #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Vennlegst vent …" gpodder-3.5.2/po/pl.po0000644000175000017500000021361212220345607014154 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2013. # Tomasz Dominikowski , 2009. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Polish (http://www.transifex.com/projects/p/gpodder/language/" "pl/)\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder na %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dzień temu" msgstr[1] "%(count)d dni temu" msgstr[2] "%(count)d dni temu" #: src/gpodder/util.py:495 msgid "Today" msgstr "Dzisiaj" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Wczoraj" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(nieznane)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekundę" msgstr[1] "%(count)d sekundy" msgstr[2] "%(count)d sekund" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d godzinę" msgstr[1] "%(count)d godziny" msgstr[2] "%(count)d godzin" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minutę" msgstr[1] "%(count)d minuty" msgstr[2] "%(count)d minut" #: src/gpodder/util.py:1245 msgid "and" msgstr "i" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Anulowane przez użytkownika" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Zapisywanie danych na dysk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Otwieranie bazy danych iPoda" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod otwarty" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Nagrywanie bazy danych iPoda" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Zapisywanie rozszerzonej bazy gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Usuwanie %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Dodawanie %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Błąd kopiowania: %(episode)s: Brak wystarczającego wolnego miejsca na " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Otwieranie odtwarzacza MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Odtwarzacz MP3 otwarty" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Błąd otwierania %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Urządzenie MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Otwieranie urządzenia MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s otwarty" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Zamykanie %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s zamknięty" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Dodawanie %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Dodane" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Skolejkowane" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Synchronizowanie" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Ukończone" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Nieudane" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Anulowane" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Wstrzymane" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Błąd: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Dodaj %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Usuń %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Brak wystarczających środków na Flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Element nie występuje na Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Już udzielono wsparcia na Flattr lub własny element" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Nieprawidłowe żądanie" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Brak połączenia internetowego" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Brak opisu" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Brak opisu" #: src/gpodder/model.py:679 msgid "unknown" msgstr "nieznany" #: src/gpodder/model.py:744 msgid "Default" msgstr "Domyślnie" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Zachowaj tylko najnowsze" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Inne" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Wideo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Audio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Nieprawidłowa nazwa użytkownika lub hasło" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Pobieranie" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Brak zawartości na serwerze" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Błąd we/wy: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Błąd HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integracja Pulpitu" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interfejs" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Po ściągnięciu" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Brak opisu dla tego rozszerzenia" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Polecenie nie znalezione: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Moduł Pythona nie znaleziony: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Polecenie: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Domyślny program" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Wczytywanie nieukończonych pobrań" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Niektóre odcinki nie zostały całkowicie pobrane w poprzedniej sesji." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d częściowy plik" msgstr[1] "%(count)d częściowe pliki" msgstr[2] "%(count)d częściowych plików" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Wznów wszystkie" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Odnaleziono nieukończone pobrania z poprzedniej sesji." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Działanie" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Potwierdź zmiany z gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Zaznacz działania do wykonania." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Wysyłanie subskrypcji" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Twoje subskrypcje są wysyłane na serwer." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Wysłanie listy powiodło się." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Błąd podczas wysyłania" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Odcinek" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Rozmiar" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Czas trwania" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Wydano" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Widoczne kolumny" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Postęp" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Wczytywanie odcinków" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Brak odcinków w bieżącym widoku" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Brak dostępnych odcinków" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Brak podcastów w tym widoku" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Brak subskrypcji" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Brak aktywnych zadań" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktywne" msgstr[1] "%(count)d aktywne" msgstr[2] "%(count)d aktywnych" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d nieudane" msgstr[1] "%(count)d nieudane" msgstr[2] "%(count)d nieudanych" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d zakolejkowano" msgstr[1] "%(count)d zakolejkowano" msgstr[2] "%(count)d zakolejkowano" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "pobieranie %(count)d pliku" msgstr[1] "pobieranie %(count)d plików" msgstr[2] "pobieranie %(count)d plików" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "synchronizowanie %(count)d pliku" msgstr[1] "synchronizowanie %(count)d plików" msgstr[2] "synchronizowanie %(count)d plików" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d zadanie skolejkowane" msgstr[1] "%(queued)d zadania skolejkowane" msgstr[2] "%(queued)d zadań skolejkowanych" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Proszę zgłosić ten problem i uruchomić program gPodder ponownie:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Nieobsługiwany wyjątek" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Błąd przetwarzania źródeł: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Nie można pobrać pewnych odcinków:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Pobrania ukończono" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Pobrania nie powiodły się" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Nie można zsynchronizować pewnych odcinków:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Synchronizacja urządzenia zakończona" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Synchronizacja urządzenia nie powiodła się" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "jeszcze %(count)d odcinek" msgstr[1] "jeszcze %(count)d odcinki" msgstr[2] "jeszcze %(count)d odcinków" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Szczegóły odcinka" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Rozpocznij pobieranie" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Pobierz" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Anuluj" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Wstrzymaj" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Usuń z listy" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Zaktualizuj podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Otwórz katalog pobrań" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Zaznacz odcinki jako stare" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Zarchiwizuj" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Usuń podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Ustawienia podcastu" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Błąd podczas konwertowania pliku." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Przesył danych przez Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Podgląd" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Odtwórz strumień" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Wyślij do" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Katalog lokalny" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Urządzenie Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Nowy" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Sflattruj to" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Status Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Proszę sprawdzić ustawienia odtwarzacza multimediów w oknie preferencji." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Błąd podczas otwierania odtwarzacza" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Dodawanie podcastów" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Proszę czekać, informacje o odcinkach są pobierane." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Istniejące subskrypcje pominięto" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Już subskrybujesz te podcasty:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Podcast wymaga uwierzytelnienia" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Proszę się zalogować do %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Uwierzytelnienie nie powiodło się" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Wykryto przekierowanie" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "Adres URL %(url)s przekierowuje do %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Odwiedzić witrynę teraz?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Nie można było dodać niektórych podcastów" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Niektóre podcasty nie mogły zostać dodane do listy:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Nieznany" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Wykryto przekierowanie" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Łączenie działań na odcinkach" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Działania na odcinkach z gpodder.net zostały połączone." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Anulowanie..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Proszę połączyć się z siecią, potem spróbować ponownie." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Brak połączenia sieciowego" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Aktualizowanie %(count)d źródła..." msgstr[1] "Aktualizowanie %(count)d źródeł..." msgstr[2] "Aktualizowanie %(count)d źródeł..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Błąd podczas aktualizowania %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Źródło %(url)s nie mogło zostać zaktualizowane." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Błąd podczas aktualizowania źródła" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Zaktualizowano %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Brak nowych odcinków" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Pobieranie %(count)d nowego odcinka." msgstr[1] "Pobieranie %(count)d nowych odcinków." msgstr[2] "Pobieranie %(count)d nowych odcinków." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Dostępne nowe odcinki" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nowy odcinek dodany do listy pobrań." msgstr[1] "%(count)d nowe odcinki dodane do listy pobrań." msgstr[2] "%(count)d nowych odcinków dodanych do listy pobrań." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "Dostępny %(count)d nowy odcinek" msgstr[1] "Dostępne %(count)d nowe odcinki" msgstr[2] "Dostępnych %(count)d nowych odcinków" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Zakończ gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "W trakcie pobierania odcinków. Można wznowić pobieranie przy następnym " "uruchomieniu programu gPodder. Zakończyć teraz?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Odcinki są zablokowane" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Zaznaczone odcinki są zablokowane. Proszę odblokować odcinki, które należy " "usunąć zanim nastąpi próba ich usunięcia." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Usunąć %(count)d odcinek?" msgstr[1] "Usunąć %(count)d odcinki?" msgstr[2] "Usunąć %(count)d odcinków?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Usunięcie odcinków oznacza usunięcie pobranych plików." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Usuwanie odcinków" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Proszę czekać, odcinki są usuwane" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Zaznacz starsze niż %(count)d dzień" msgstr[1] "Zaznacz starsze niż %(count)d dni" msgstr[2] "Zaznacz starsze niż %(count)d dni" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Zaznacz odtworzone" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Wybór zakończono" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Proszę zaznaczyć odcinki do usunięcia:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Usuń odcinki" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Brak zaznaczonych podcastów" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Proszę zaznaczyć podcast z listy podcastów do aktualizacji." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Błąd podczas pobierania %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Błąd pobierania" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Proszę zaznaczyć odcinki do pobrania." #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Oznacz jako stary" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Proszę sprawdzić dostępność nowych odcinków później." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Brak dostępnych nowych odcinków" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Zaloguj się do gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Proszę się zalogować, aby pobrać subskrypcje." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Subskrypcje na gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Proszę wybrać podcast z listy podcastów do zmodyfikowania." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Usuwanie podcastów" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Proszę zaznaczyć podcast do usunięcia:" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Usuń" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Usuwanie podcastu" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Proszę czekać, podcast jest usuwany" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Na pewno usunąć ten podcast i wszystkie jego odcinki?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Usuwanie podcastów" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Proszę czekać, podcasty są usuwane" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Na pewno usunąć zaznaczone podcasty i ich odcinki?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Proszę wybrać podcast z listy podcastów do usunięcia." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Pliki OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Zaimportuj z OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Zaimportuj podcasty z pliku OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Brak elementów do wyeksportowania" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Lista subskrypcji jest pusta. Należy najpierw dodać subskrypcje jakichś " "podcastów." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Eksportuj do OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Wyeksportowano %(count)d subskrypcję" msgstr[1] "Wyeksportowano %(count)d subskrypcje" msgstr[2] "Wyeksportowano %(count)d subskrypcji" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Wyeksportowanie listy podcastów powiodło się." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Nie można było wyeksportować OPML do pliku. Proszę sprawdzić uprawnienia." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Eksport do OPML nie powiódł się" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Brak aktualizacji" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Masz najnowszą wersję gPoddera." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nowa wersja dostępna" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Zainstalowana wersja: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Najnowsza wersja: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Data wydania: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Pobierz najnowszą wersję z gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "O gPodderze" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Przekaż darowiznę / lista życzeń" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Zgłoś problem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Tomasz Dominikowski , 2009, 2010.\n" "Filip Kłębczyk , 2013." #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Tłumaczenie:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Podziękowania dla:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Proszę wybrać odcinek z listy odcinków, aby wyświetlić jego notatki." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Nie wybrano żadnego odcinka" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Nie można uruchomić programu gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Błąd D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "od %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Liczba całkowita" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Liczba zmiennoprzecinkowa" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Typ logiczny" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Ciąg" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Zaloguj się" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Sflattrowany" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "wydano %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "odtworzony" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "nieodtworzony" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "dzisiaj" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "pobrano %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Usunięte" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nowy odcinek" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Pobrany odcinek" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Pobrany odcinek wideo" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Pobrany obraz" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Pobrany plik" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "brakujący plik" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nigdy niewyświetlany" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nigdy nieodtwarzany" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nigdy nie otwarto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "wyświetlony" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "otwarto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "powstrzymano usunięcie" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Wszystkie odcinki" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "ze wszystkich podcastów" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Subskrypcja wstrzymana" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Brak zawartości do wklejenia." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Schowek jest pusty." #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nazwa użytkownika" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Nowy użytk." #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Zaloguj" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Wymagane uwierzytelnienie" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Hasło" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Proszę wybrać miejsce docelowe" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Ustawienie" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Ustaw na" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Nie można ustawić %(field)s na %(value)s. Wymagany typ danych: %(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Błąd podczas ustawiania opcji" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nic nie rób" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Wyświetl listę odcinków" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Dodaj do listy pobrań" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Pobierz natychmiast" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Żaden" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Oparty o system plików" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Zaznacz jako odtworzony" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Usuń z gPoddera" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Błąd" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Niestandardowy (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nazwa" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Czas trwania" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Informacja o module rozszerzenia" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Proszę zaloguj się w Flattr i wesprzyj publikujących" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Zaloguj się do Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Zalogowany jako %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Wyloguj się" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Integracja z Flattr wymaga Webkit/Gtk" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "Webkit/Gtk nieznaleziony" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Rozszerzenie nie może być aktywowane" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Informacja o module rozszerzenia" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Skonfiguruj odtwarzacz dźwięku" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Polecenie:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Skonfiguruj odtwarzacz wideo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "Ręcznie" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "po %(count)d dniu" msgstr[1] "po %(count)d dniach" msgstr[2] "po %(count)d dniach" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Zastąp listę subskrypcji na serwerze" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Zdalne podcasty które nie zostały dodane lokalnie zostaną usunięte na " "serwerze. Kontynuować?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Wybierz folder dla punktu montowania" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Wybór katalogu jako punktu montowania" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Szukaj" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" "Podany adres URL nie dostarcza żadnych poprawnych elementów podcastów OPML." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nie odnaleziono źródeł" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Brak kanałów YouTube pasujących do tego zapytania." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nie odnaleziono kanałów" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Zaznacz wszystkie" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Odznacz wszystkie" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Brak zaznaczenia" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d odcinek" msgstr[1] "%(count)d odcinki" msgstr[2] "%(count)d odcinków" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "rozmiar: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Źródło %(url)s nie mogło zostać zaktualizowane." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Błąd podczas otwierania odtwarzacza" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Dodanie sekcji" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nowa sekcja:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Proszę wybrać nową okładkę dla podcastu" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Można tutaj upuścić tylko pojedynczy obraz lub adres URL." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Przeciągnij i upuść" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Można tutaj tylko upuścić pliki lokalne i adresy URL http://." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Żadne urządzenie nie jest skonfigurowane" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Proszę ustaw swoje urządzenie w oknie ustawień." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Nie można otworzyć urządzenia" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Proszę sprawdź ustawienia w oknie preferencji" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Brak wystarczającej ilości miejsca na urządzeniu" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Dodatkowa wolna przestrzeń wymagana: %(required_space)s\n" "Czy chcesz kontynuować?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Wysłanie listy powiodło się." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Błąd podczas konwertowania pliku." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Wszystkie" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ukryj usunięte" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Pobrane" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Zarchiwizowane" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Widea" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Częściowo odtworzone" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Pobrane nieodtwarzane" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Sflattrowano (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Sflattruj to (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Zaloguj się do Flattr w ustawieniach" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Sflattrowanie odcinka..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Nie można było zalogować do Flattra" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Usuń" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Wysyłanie subskrybcji..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Błąd przy wysyłaniu:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Zaktualizuj wszystkie" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Zaktualizuj" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Zmień nazwę" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Zmień sekcję" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Usuń subskrypcję" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Łączenie działań na odcinkach..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Łączenie działań na odcinkach (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Usunąć ten podcast i odcinki?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nowa nazwa sekcji:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nowa nazwa:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Usunąć ten odcinek?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Oznacz jako nowy" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Zezwól na usuwanie" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Dodaj do kolejki odtwarzania" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Dodawanie podcastów..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Nie można było dodać niektórych podcastów" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Wznów" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Nieznana ścieżka" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s na Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Ścieżki opublikowane przez %s na Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Ulubione użytkownika %s na Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Ścieżki opublikowane przez użytkownika %s na Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Pobieracz napisów dla TED Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Pobiera napisy w formacie .srt dla nagrań TED Talks" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Skonwertuj pliki wideo do MP4 dla Rockboksa" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Konwertuj wszystkie wideo do formatu Rockbox-kompatybilnego" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Plik skonwertowano" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Wskaźnik Aplikacji Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Pokaż wskaźnik statusu na górnym pasku" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Pokaż główne okno" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Zakończ" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Zmień nazwy odcinków po pobraniu" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Zmień nazwy odcinków na \".\" przy pobraniu" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Konwersja nieudana" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Przekoduj pliki .ogg na .mp3 używając ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Skonwertuj na %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Konwersja nieudana" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Usuń okładki z plików OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Usuwa okładki z wszystkich pobranych plików ogg" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Usuń okładkę" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Skolejkuj w odtwarzaczach multimedialnych" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Dodaj element menu kontekstowego dla skolejkowanych odcinków w " "zainstalowanych odtwarzaczach multimedialnych" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Skolejkuj w" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Szukaj nowych odcinków przy starcie" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Rozpoczyna wyszukiwanie nowych odcinków na starcie" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Znormalizuj dźwięk ponownie kodując" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Znormalizuj głośność plików audio normalizacją audio." #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Plik znormalizowano" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Ikona statusu Gtk" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Pokaż ikonę statusu dla pulpitów opartych na Gtk" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimalizuj na starcie" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimalizuje okno gPoddera na starcie." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Konwersja nieudana" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Przekoduj pliki .ogg na .mp3 używając ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Taguj wszystkie pobrane pliki Mutagenem" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Dodaj tytuły odcinków i podcastów do tagów MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integracja Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Pokaż postęp pobierania w ikonie Unity Launcher" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Dodawanie nowego podcastu" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Adres URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Edytor podcastów programu gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Sekcja:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Wyłącz aktualizowanie źródeł (wstrzymuje subskrypcje)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Synchronizuj z urządzeniami odtwarzającymi MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Strategia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Ogólne" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Uwierzytelnianie HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nazwa użytkownika:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Hasło:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Położenia" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Pobieranie do:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Witryna:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "etykieta witryny" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Zaawansowane" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Edytor konfiguracji programu gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Szukaj:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Wyświetl wszystkie" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Sprawdź dostępność nowych" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Pobierz nowe odcinki" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencje" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Subskrypcje" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Znajdź nowe podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Dodaj podcast przez adres URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Zaimportuj z pliku OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Wyeksportuj do pliku OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Przejdź do gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Odcinki" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Odtwórz" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Otwórz" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Przełącz nowy status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Zmień blokadę usuwania" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "D_odatki" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Synchronizuj z urządzeniem" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Widok" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Wszystkie odcinki\" na liście podcastu" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Użyj sekcji dla listy podcastu" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Pasek narzędzi" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Opisy odcinków" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ukrywanie usuniętych odcinków" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Pobrane odcinki" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Nieodtworzone odcinki" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ukrywanie podcastów bez odcinków" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Pomo_c" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Instr. użytk." #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Aktualizacje oprogramowania" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtr:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasty" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Ograniczenie prędkości do" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Ograniczenie liczby pobrań do" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Wybierz odcinki" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Jak zacząć?" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Witaj w gPodderze" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Twoja lista podcastów jest pusta." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Wybierz z listy przykładowych podcastów" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Dodaj podcast wprowadzając jego URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Wczytaj moje subskrypcje z gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Odtwarzacz dźwięku:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Odtwarzacz wideo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Preferowany format video:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Rozszerzenia" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Automatycznie flattruj odcinki przy odtwarzaniu" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Zsynchronizuj działania na subskrypcjach i odcinkach" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Zamień listę na serwerze używając lokalnych subskrypcji" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nazwa urządzenia:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Częstotliwość aktualizacji:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maksymalna liczba odcinków na podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Gdy nowe odcinki zostaną odnalezione:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Aktualizowanie" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Usuwanie odtworzonych odcinków:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Usuń odtworzone odcinki nawet jeśli niezakończone" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Usuwanie także nieodtworzonych odcinków" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Porządkuj" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Typ urządzenia:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Punkt montowania:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Po synchronizacji odcinka:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Zastąp listę subskrypcji na serwerze" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Nazwa listy odtwarzania:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Synchronizuj tylko nieodtwarzane odcinki" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Urządzenia" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Zmodyfikuj konfigurację" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Znajdź nowe podcasty" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Zaznacz wszystko" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Odznacz wszystko" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Wyszukiwanie" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "_Najpopularniejsze podcasty" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Teraz odtwarzane" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Dodawanie podcastów" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Ustawienia" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "O programie" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Dzięki" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Zasługi" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Zasługi" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nazwa urządzenia" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "ustawienia gPoddera" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientacja ekranu" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Automatyczne obracanie" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indeksowanie mediów" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Pokaż podcasty w aplikacji muzycznej" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Auto-Flattr przy odtwarzaniu" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Włącz synchronizację" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Zaloguj się do gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Zastąp listę na serwerze" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Brak konta? Zarejestruj się tutaj" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Kolejka odtwarzania" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Lista odtwarzania pusta" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Szczegóły odcinka" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Pobierz odcinki" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Odtwórz odcinki" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notatki o odcinku" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Wybierz pobrane" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Odwróć zaznaczenie" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Brak podcastów." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Dodaj swój pierwszy podcast teraz." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Brak odcinków" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Naciśnij by wybrać filtr" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Pokaż odcinki" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Wyszukaj słowo lub URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Toplista" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Mój gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Przykłady" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "zasilane przez gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Subskrybuj" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] " %(count)s minuta" msgstr[1] "%(count)s minuty" msgstr[2] "%(count)s minut" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s sekunda" msgstr[1] "%(count)s sekundy" msgstr[2] "%(count)s sekund" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Data wydania: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Aktualizacja podcastu żądana przez rozszerzenia" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Pobranie odcinku żądane przez rozszerzenia." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "Nieprawidłowy url: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Nie subskrybujesz %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Nie można subskrybować się do %s" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Nie można subskrybować się do %s" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s pomyślnie dodany." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Ta opcja konfiguracyjna nie istnieje." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Można ustawić tylko węzły konfiguracyjne liści." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Zmieniono nazwę %(old_title)s na %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Odsubskrybowano %s" #: bin/gpo:473 msgid "Updates disabled" msgstr "Aktualizacje zablokowane" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d nowy odcinek" msgstr[1] "%(count)d nowe odcinki" msgstr[2] "%(count)d nowych odcinków" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Sprawdzanie za nowymi odcinkami" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Pominięcie %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Zablokuj aktualizację kanału z %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Włącz aktualizację kanału z %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Nasłuchiwania na WSZYSTKICH interfejsach sieciowych" #: bin/gpo:622 msgid "No podcasts found." msgstr "Nie znaleziono podcastów." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Wprowadź index by subskrybować, ? dla listy" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Nieprawidłowa wartość" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Nieprawidłowy URL: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "Zmieniono URL z %(old_url)s na %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Błąd składni: %(error)s" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "Żądana funkcja nie jest dostępna." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "wypisz wyjście logowania na konsolę" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "używaj opartego o QML interfejsu użytkownika Meego 1.2 Harmattan" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "subskrybuj się do kanału pod URLem" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Numer procesu aplikacji Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Klient Podcastów gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Klient Podcastów" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Subskrybuj się do treści audio i wideo z sieci" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Skonwertuj pliki .flv z YouTube na .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Przydatne do odtwarzania pobranych wideo na odtwarzaczach sprzętowych" #~ msgid "Convert FLV to MP4" #~ msgstr "Skonwertuj FLV na MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Skonwertuj audio M4A na MP3 lub OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Przekoduj pliki .m4a na mp3 lub .ogg używając ffmpeg" #~ msgid "Convert OGG audio to MP3" #~ msgstr "Skonwertuj dźwięk w formacie OGG na MP3" #~ msgid "File converted from ogg to mp3" #~ msgstr "Pliki skonwertowane z ogg na mp3" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konwersja z ogg na mp3 nie powiodła się" gpodder-3.5.2/po/pt.po0000644000175000017500000021125412220345607014164 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Joel Calado , 2007. # Sérgio Marques , 2010,2012-2013. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/gpodder/" "language/pt/)\n" "Language: pt\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder em %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dia atrás" msgstr[1] "%(count)d dias atrás" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoje" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ontem" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(desconhecido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "e" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado pelo utilizador" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "A escrever dados no disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "A abrir base de dados iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod aberto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "A gravar base de dados iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "A escrever base de dados detalhada gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "A remover %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "A adicionar %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Erro ao copiar %(episode)s: não possui espaço suficiente em %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "A abrir leitor MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Leitor MP3 aberto" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Erro ao abrir %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "A abrir dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s aberto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "A fechar %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s fechado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "A adicionar %s." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Adicionado" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Na fila" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "A sincronizar" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Concluído" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Falhou" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausado" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Erro: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Adicionar %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Remover %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Sem possibilidade de flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "O item não existe no Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Já flattred ou item próprio" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Pedido inválido" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Sem ligação à Internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Sem descrição" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Sem descrição" #: src/gpodder/model.py:679 msgid "unknown" msgstr "desconhecido" #: src/gpodder/model.py:744 msgid "Default" msgstr "Padrão" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Manter última" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Outros" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vídeo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Áudio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Utilizador/senha inválida" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "A transferir" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "O conteúdo não existe no servidor" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro E/S: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integração no ambiente de trabalho" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interface" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Enviar transferência" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Sem descrição para esta extensão." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Comando não encontrado: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python não encontrado: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicação padrão" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "A carregar transferências incompletas" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Alguns episódios da sessão anterior não foram transferidos." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d ficheiro parcial" msgstr[1] "%(count)d ficheiros parciais" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Retomar todas" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Foram encontradas transferências incompletas da sessão anterior." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Ação" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar alterações de gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Selecione as ações a executar." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "A enviar subscrições" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "As suas subscrições estão a ser enviadas para o servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista enviada com sucesso." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Erro ao enviar" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episódio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamanho" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duração" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publicado" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Colunas visíveis" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Evolução" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "A carregar episódios" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Sem episódios na vista atual" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Sem episódios disponíveis" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Sem podcasts nesta vista" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Sem subscrições" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Sem tarefas ativas" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d ativa" msgstr[1] "%(count)d ativas" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d falha" msgstr[1] "%(count)d falhas" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d na fila" msgstr[1] "%(count)d na fila" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "A transferir %(count)d ficheiro" msgstr[1] "A transferir %(count)d ficheiros" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "a sincronizar %(count)d ficheiro" msgstr[1] "a sincronizar %(count)d ficheiros" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d tarefa na fila" msgstr[1] "%(queued)d tarefas na fila" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Reporte este problema e reinicie o gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Exceção não controlada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Erro no processador de fontes: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Não foi possível receber alguns episódios:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Transferências concluídas" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Transferências falhadas" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Não foi possível sincronizar alguns episódios:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Sincronização terminada" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Falha de sincronização" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "Mais %(count)d episódio" msgstr[1] "Mais %(count)d episódios" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalhes do episódio" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Iniciar transferência" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Transferir" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausar" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Remover da lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Atualizar podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir pasta de transferências" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar episódios como antigos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arquivo" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Remover podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Definições do podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Erro ao converter ficheiro" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferência por bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Antevisão" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Emissão" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar para" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Pasta local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Novo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Flattr isto" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Estado Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Verifique as definições do leitor multimédia nas preferências" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Erro ao abrir o leitor" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "A adicionar podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Aguarde enquanto a informação do episódio é transferida." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Subscrições existentes ignoradas" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Você já subscreveu estes podcasts:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "O podcast requer autenticação" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Inicie sessão em %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Falha ao autenticar" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Detetado um reencaminhamento do sítio web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "O URL %(url)s reencaminhou-o (a) para %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Pretende visitar agora o sítio web?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Não foi possível adicionar alguns podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Alguns podcasts não puderam ser adicionados à sua lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Desconhecido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Reencaminhamento detetado" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "A unir ações de episódios" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "As ações dos episódios do gpodder.net foram unidas." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "A cancelar..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Ligue a uma rede e tente novamente." #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Sem ligação à rede" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "A atualizar %(count)d fonte..." msgstr[1] "A atualizar %(count)d fontes..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Erro ao atualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "A fonte %(url)s não foi atualizada." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Erro ao atualizar a fonte" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Atualizado %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Sem novos episódios" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "A transferir %(count)d novo episódio" msgstr[1] "A transferir %(count)d novos episódios" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Novos episódios disponíveis" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d novo episódio adicionado à lista de transferência." msgstr[1] "%(count)d novos episódios adicionados à lista de transferência." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d novo episódio disponível" msgstr[1] "%(count)d novos episódios disponíveis" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Sair do gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Existem episódios a serem transferidos. Pode retomar as transferências na " "próxima vez que iniciar o gPodder. Pretende sair agora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Os episódios estão bloqueados" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Os episódios selecionados estão bloqueados. Deve desbloqueá-los antes de os " "eliminar." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Eliminar %(count)d episódio?" msgstr[1] "Eliminar %(count)d episódios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Se eliminar os episódios, remove os ficheiros transferidos." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "A eliminar episódios" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Por favor aguarde pela eliminação dos episódios" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Selecionar anteriores a %(count)d dias" msgstr[1] "Selecionar anteriores a %(count)d dias" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Selecionar reproduzidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Selecionar terminados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Selecione os episódios que pretende eliminar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Eliminar episódios" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Nenhum podcast selecionado" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Escolha, na lista, o podcast que pretende atualizar." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Erro ao transferir %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Erro ao transferir" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Selecione os episódios que pretende transferir:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcar como antigo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Verificar por episódios mais tarde." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Sem novos episódios" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Iniciar sessão em gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Inicie a sessão para transferir as suas subscrições." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Subscrições em gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Escolha, na lista, os podcasts que pretende editar." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Remover podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Selecione o podcast que pretende remover." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Remover" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "A remover podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Aguarde pela remoção do podcast" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Pretende mesmo remover este podcasts e os seus episódios?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "A remover podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Por favor aguarde pela remoção dos podcasts" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Deseja mesmo remover o podcast selecionado e os seus episódios?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Escolha, na lista, os podcasts a remover." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Ficheiros OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar de OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts de um ficheiro OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nada a exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "A sua lista de subscrições está vazia. Subscreva alguns podcasts antes de " "tentar exportar a sua lista de subscrições." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar para OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d subscrição exportada" msgstr[1] "%(count)d subscrições exportadas" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "A sua lista de podcasts foi exportada com sucesso." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Não foi possível exportar OPML para ficheiro. Verifique as suas permissões." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Falha ao exportar OPML" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Não existem atualizações" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Já tem a versão mais recente do gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Está disponível uma nova versão." #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Versão instalada: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versão mais recente: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Data de disponibilização: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Pretende transferir a nova versão?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Sobre o gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donativos/Pedidos" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Reportar um problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Joel Calado \n" "Sérgio Marques " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Traduzido por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Obrigado a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Escolha um episódio da lista para mostrar as notas." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Nenhum episódio selecionado" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Incapaz de iniciar gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Erro D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "por %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Inteiro" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flutuante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Booleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Texto" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Iniciar sessão" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Flattred" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicado %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "reproduzido" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "não reproduzido" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoje" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "transferido %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Eliminado" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Novo episódio" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episódio transferido" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Vídeo transferido" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagem transferida" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Ficheiro transferido" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "ficheiro em falta" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nunca exibido" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nunca reproduzido" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nunca aberto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "exibido" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "aberto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "eliminação prevenida" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos os episódios" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "de todos os podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Subscrição pausada" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nada para colar" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "A área de transferência está vazia" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Utilizador" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Novo utilizador" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Iniciar sessão" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Requer autenticação" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Senha" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Selecione o destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Definição" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Definir para" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Não é possivel definir %(field)s para %(value)s. Requer o tipo de dados: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Erro ao definir opção" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nada fazer" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Mostrar lista de episódios" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Adicionar à lista de transferências" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Transferir imediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Nenhum" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Sistema de ficheiros" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Marcar como reproduzido" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Eliminar do gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Erro" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Personalizado (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nome" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duração" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Informações da extensão" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Inicie sessão no Flattr e apoie os editores" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Iniciar sessão no Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Sessão iniciada como %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Sair da sessão" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "A integração com o Flattr requer WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk não encontrado" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "A extensão não pode ser ativada" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Informações da extensão" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurar reprodutor de áudio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar reprodutor de vídeo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "após %(count)d dia" msgstr[1] "após %(count)d dias" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Substituir lista de subscrições no servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Os podcasts remotos que não forem adicionados localmente serão removidos do " "servidor. Continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Escolha a pasta para ponto de montagem" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Escolha a pasta para ponto de montagem" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Procurar" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "O URL indicada não fornece qualquer podcast OPML válido." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nenhuma fonte encontrada" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Não existem canais no YouTube que coincidam com esta consulta." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nenhum canal encontrado" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Selecionar todos" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Selecionar nenhum" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nada selecionado" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episódio" msgstr[1] "%(count)d episódios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamanho: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "A fonte %(url)s não foi atualizada." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o leitor" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Adicionar secção" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nova secção:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Selecione uma nova imagem para o podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Só pode arrastar para aqui uma imagem ou um URL." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arraste e largue" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Só pode arrastar para aqui ficheiros locais e URLs http://." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Nenhum dispositivo configurado" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Tem que configurar o dispositivo nas preferências" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Não foi possível abrir o dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Verifique as definições nas preferências" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Não possui espaço livre neste dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Espaço livre necessário: %(required_space)s\n" "Continuar?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lista enviada com sucesso." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Erro ao converter ficheiro" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Tudo" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Ocultar eliminados" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Transferidos" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Arquivados" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vídeos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Reproduzido parcialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Transferências não reproduzidas" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Flattred (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Flattr isto (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Inicie sessão no Flattr nas definições." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flattring episódio..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Sessão não iniciada no Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Eliminar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "A enviar subscrições..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Erro ao enviar:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Atualizar tudo" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Atualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Mudar nome" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Alterar secção" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Remover subscrição" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "A unir ações de episódios..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "A unir ações de episódios (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Remover este podcast e os seus episódios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nome da nova secção:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Novo nome:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Eliminar este episódio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcar como novo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir eliminação" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Adicionar à fila de reprodução" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "A adicionar podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Não foi possível adicionar alguns podcasts" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Retomar" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Faixa desconhecida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s no Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Faixas publicadas por %s no Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Os favoritos de %s no Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Faixas favoritas de %s no Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Transferência de legendas para Ted Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Transfere as legendas .srt dos vídeos Ted Talks" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Converter ficheiros de vídeo para Rockbox MP4" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Converter todos os vídeos para um formato compatível com o Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Ficheiro convertido" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Indicador Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Mostrar um indicador de estado na barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar janela principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Sair" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Mostrar evolução da transferência no lançador Unity." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Mudar nome dos episódios após a receção" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Mudar nome dos episódios para \".\" ao receber" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Falha na conversão" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Converter ficheiros ogg para mp3 com o ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Converter para %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Falha na conversão" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Remover imagem dos ficheiros OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "Remove a imagem dos ficheiros ogg transferidos" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Remover imagem" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Colocar na fila do reprodutor multimédia" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Adicionar item no menu de contexto para colocar os episódios na fila dos " "reprodutores" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Colocar na fila de" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Procurar episódios ao iniciar" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Iniciar procura de novos episódios ao iniciar" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizar som ao converter" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizar o volume dos ficheiros com o normalize-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Ficheiro normalizado" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Ícone de estado GTK" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Mostrar ícone de estado para os ambientes de trabalho GTK+" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizar ao iniciar" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiza o gPodder ao iniciar a sessão." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Falha na conversão" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Converter ficheiros ogg para mp3 com o ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Criar detalhes, via mutagen, nos ficheiros recebidos" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Adicionar título do episódio e podcast aos detalhes MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Integração com o Ubuntu Unity" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Mostrar evolução da transferência no lançador Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Adicionar novo podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder - Editor de Podcasts" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Secção:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desativar atualização de fontes" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sincronizar com dispositivos MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Estratégia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Geral" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticação HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Utilizador:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Senha:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Localizações" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Transferir para:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Sítio web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "marca do sítio web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avançado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder - Editor de Configurações" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Procurar:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Mostrar tudo" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Procurar novos episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Transferir novos episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferências" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Subscrições" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Descobrir novos podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Adicionar podcast via URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar de ficheiro OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar para ficheiro OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir para gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproduzir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Alternar estado" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Mudar bloqueio de eliminação" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizar com dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Ver" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Todos os episódios\" na lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Utilizar secções para a lista de podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de ferramentas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descrição do episódio" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ocultar episódios eliminados" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episódios transferidos" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ocultar podcasts sem episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "Aj_uda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual de utilizador" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Atualizações do programa" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitar velocidade a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitar transferências a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Selecione os episódios" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Introdução" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Bem-vindo ao gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "A lista de podcasts está vazia." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Escolha uma lista de exemplos" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Adicione um podcast através de um URL." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Restaurar as minhas subscrições do gPodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Reprodutor áudio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Reprodutor vídeo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Formato vídeo preferido:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensões" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Flattr automático de episódios ao reproduzir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar subscrições e episódios" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Substituir lista do servidor pelas subscrições locais" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nome do dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de atualização:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de episódios por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Ao encontrar novos episódios:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Atualização" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Eliminar episódios reproduzidos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Remover podcasts reproduzidos mesmo se não totalmente" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Remover também os episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpeza" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Ponto de montagem:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Depois de sincronizar um episódio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Substituir lista no servidor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Lista de reprodução vazia" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Sincronizar os episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar configuração" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Encontrar novos podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Selecionar tudo" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Selecionar nada" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Procurar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Melhores _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "A reproduzir" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "A adicionar podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Definições" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Sobre" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecimentos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nome do dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Definições" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientação do ecrã" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Rotação automática" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indexação multimédia" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Mostrar podcasts na aplicação de música" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Flattr automático ao reproduzir" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Ativar sincronização" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Iniciar sessão em gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Substituir lista no servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Não tem conta? Registe-se aqui" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Fila de reprodução" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Lista de reprodução vazia" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalhes do episódio" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Transferir episódios" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Reproduzir episódios" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notas" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Selecionar recebidos" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Inverter seleção" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Sem podcasts." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Adicione agora o seu primeiro podcast." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Sem episódios" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Clique aqui para alterar o filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar episódios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Termo de procura ou URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Melhores" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "My gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Exemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "disponibilizado por gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Subscrever" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Data de disponibilização: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Atualização de podcast solicitado pelas extensões." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Transferência de episódio solicitada pelas extensões." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "URL inválido: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Você ainda não subscreveu %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Não é possível subscrever %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Não é possível subscrever %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s foi adicionado com sucesso." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Esta opção não existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Só pode definir estruturas dependentes." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Nome mudado de %(old_title)s para %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Cancelada a subscrição em %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Atualizações inativas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d novo episódio" msgstr[1] "%(count)d novos episódios" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "A procurar novos episódios" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "A ignorar %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "A desativar fonte de atualização de %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "A ativar fonte de atualização de %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Receber de todas as interfaces de rede." #: bin/gpo:622 msgid "No podcasts found." msgstr "Nenhum podcast encontrado." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Indique o índice de subscrição ou ? para uma lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor inválido." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL inválido: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL alterado de %(old_url)s para %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Erro de sintaxe: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Comando inválido, Será que queria escrever..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "A função solicitada não está disponível." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "mostrar mensagem de erros na consola" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "utilize QML-based MeeGo 1.2 Harmattan UI" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "subscrever a fonte do URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número do processo Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder - Programa de podcasts" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Programa de podcasts" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Subscrever conteúdo áudio e vídeo na web" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Converter ficheiros .flv do YouTube para .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "" #~ "Útil se quiser reproduzir ficheiros transferidos nos reprodutores " #~ "multimédia" #~ msgid "Convert FLV to MP4" #~ msgstr "Converter FLV para MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Converter M4A para MP3 ou OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Converter ficheiros .m4a para .mp3 ou .ogg com o ffmpeg" #~ msgid "Convert OGG audio to MP3" #~ msgstr "Converter OGG para MP3" #~ msgid "File converted from ogg to mp3" #~ msgstr "Ficheiro convertido de ogg para mp3" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Falha ao converter de ogg para mp3" gpodder-3.5.2/po/pt_BR.po0000644000175000017500000021224112220345610014536 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Dudu Maroja , 2010. # Eduardo Maroja , 2009. # Enrico Nicoletto , 2013. # Joel Calado , 2007. # Rafael Ferreira , 2012-2013. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-03-05 15:01+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "gpodder/language/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder em %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dia atrás" msgstr[1] "%(count)d dias atrás" #: src/gpodder/util.py:495 msgid "Today" msgstr "Hoje" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ontem" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(desconhecido)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d segundo" msgstr[1] "%(count)d segundos" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d hora" msgstr[1] "%(count)d horas" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minuto" msgstr[1] "%(count)d minutos" #: src/gpodder/util.py:1245 msgid "and" msgstr "e" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Cancelado pelo usuário" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Gravando dados no disco" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Abrindo o banco de dados do iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod aberto" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Salvando o banco dando de dados do iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Gravando banco de dados extendido do gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Removendo %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Adicionando %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "Erro ao copiar %(episode)s: Não há espaço suficiente em %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Abrindo o tocador MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Tocador MP3 aberto" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Erro ao abrir %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispositivo MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Abrindo o dispositivo MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s aberto" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Fechando %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s fechado" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Adicionando %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Adicionado" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Em espera" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "Sincronizando" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Terminados" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Falhou" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Cancelado" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausado" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Erro: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Adicionar %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Remove %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "Sem possibilidade de flattr" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "Item não existe no Flattr" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "Já no Flattr ou item próprio" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "Requisição inválida" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "Sem conexão com à Internet" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "Nnenhuma descrição" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Descrição não disponível" #: src/gpodder/model.py:679 msgid "unknown" msgstr "desconhecido" #: src/gpodder/model.py:744 msgid "Default" msgstr "Padrão" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "Apenas manter as últimas" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Outro" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Vídeo" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Áudio" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Login/Password inválidos" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Downloading" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Conteúdo do servidor esta faltando" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Erro de I/O: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Erro de HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "Integração com a área de trabalho" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "Interface" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "Pós-Download" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Nenhuma descrição para a extensão" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "Comando não foi encontrado: %(command)s" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "Módulo python não foi encontrado: %(module)s" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Comando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicativo Padrão" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Carregando downloads incompletos" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Alguns episódios não terminaram de baixar na sessão anterior." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d arquivo parcial" msgstr[1] "%(count)d arquivos parciais" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Resumir tudo" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Downloads incompletos de uma sessão anterior foram encontrados." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Ação" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmar alterações do gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Selecione as ações que você deseja executar." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Enviando Inscrições" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Sua lista de inscrições esta sendo enviada para o servidor." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Envio efetuado com sucesso." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Erro durante o envio" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Espisódio" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Tamanho" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Duração" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publicado" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Colunas visíveis" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Progresso" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Lendo episódios" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Nenhum episódio nesta vizualização" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Nenhum Episódio disponível" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Nenhum podcast nesta visualização" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Nenhuma inscrição" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "Nenhuma tarefa ativa" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d ativo" msgstr[1] "%(count)d ativos" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d falhou" msgstr[1] "%(count)d falharam" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d enfilerado" msgstr[1] "%(count)d enfilerados" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "baixando %(count)d arquivo" msgstr[1] "baixando %(count)d arquivos" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "sincronizando %(count)d arquivo" msgstr[1] "sincronizando %(count)d arquivos" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "%(queued)d tarefa enfileirada" msgstr[1] "%(queued)d tarefas enfileiradas" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Por favor reporte este problema e reinicie o gPodder" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Esseção não manejada" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Erro no feedparser: %s" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "Não foi possível baixar alguns episódios:" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Downloads completos" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Download falhou" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "Não foi possível sincronizar alguns episódios:" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "Sincronização do dispositivo finalizou" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "Sincronização de dispositivo falhou" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d episódio mais" msgstr[1] "%(count)d episódios mais" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalhes do episódio " #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Iniciar download agora" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Download" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Cancelar" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausar" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Remover da lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Atualizar podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Abrir pasta de Download" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Marcar episódios como velhos" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arquivamento" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Remover podcast" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Configurações do podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Erro ao converter o aquivo" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transferência via Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Pré-visualização" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Stream" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Enviar para" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Pasta local" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Dispositivo bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Novo" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "Flattr isso" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "Estado Flattr" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Por favor verifique as configurações dos seu media player nas preferencias" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Erro ao abrir o player" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Adicionando podcasts" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Por favor aguarde enquanto a informações dos episódios e baixada" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Incrições existentes ignoradas" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Você inscreveu estes podcasts" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "O Podcast exige autenticação" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Por favor logue em %s" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autenticação falhou" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Redirecionamento de website detectado" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "A URL %(url)s redireciona para %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Você deseja visitar o website agora?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Não foi possíovel adicionar alguns podcasts" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Alguns podcasts não foram adicionados a sua lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Desconhecido" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Redirecionamento Detectado" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Mesclando ações de episódios" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Ações de episódios do gpodder.net foram mescladas." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Cancelando..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "Por favor conecte-se a uma rede e então tente novamente" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "Sem conexão de rede" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Atualizando %(count)d fonte..." msgstr[1] "Atualizando %(count)d fontes..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Erro ao atualizar %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "A fonte em %(url)s não pôde ser atualizada." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Erro durante a atualização do feed" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s (%(position)d/%(total)d) Atualizados" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Sem novos episódios" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Baixando %(count)d novo episódio." msgstr[1] "Baixando %(count)d novos episódios." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Novo episódio disponível" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d novo episódio foi adicionado à lista de downloads." msgstr[1] "%(count)d novos episódios foram adicionados à lista de downloads." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d novo episódio disponível" msgstr[1] "%(count)d novos episódios disponíveis" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Sair do gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Você esta baiando episódios. Você pode continuar o downloaa da próxima vez " "que rodar o gPodder. Deseja sair agora?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Os espisódos estão protegidos" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Os episódis selecionados estão protegidos. Desproteja os episódios quevocê " "pretende deletar primeiro." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Excluir %(count)d episódio?" msgstr[1] "Excluir %(count)d episódios?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Ao excluir episódios, está se removendo os arquivos baixados." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Excluindo episódios" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Por favor aguarde enquanto os episódios são deletados." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Selecionar mais antigos do que %(count)d dia" msgstr[1] "Selecionar mais antigos do que %(count)d dias" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Selecrinar os reprodizidos" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Selecionar finalizados" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Selecione os episódios que você deseja deletar:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Excluir episódios" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Nenhum podcast selecionado" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Por favor Selecione um podcast da lista para atualizá-lo" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Erro ao baixar %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Erro de download" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Selecione o episódio que você deseja baixar" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marque como antigo" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Por faver verifique por novos episódios mais tarde." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Sem novos episódios disponíveis " #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Conectar ao gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Por favor faça o login para baixar suas inscrições." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Inscrições no gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Por favor selecione um podcast da lista para edita-lo" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Remover podcasts" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Selecione o podcast que você quer remover" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Remover" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Removendo podcast" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Porfavor, aguarde enquanto o podcast é removido" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Você realmente deseja remover este podcast e todos seus episódios?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Removendo podcasts" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Porfavor, aguarde enquanto os podcasts são removidos" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Você realmente deseja remover os podcasts selecionados e seus episódios?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Por favor selecione um podcast da lista para remove-lo" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Arquivos OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importar de um arquivo OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importar podcasts de aquivo OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nada para exportar" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Sua lista de inscrição de podcasts esta vazia, por favor se inscreva aluns " "podcasts antes de tentar exportar sua lista de incrição" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportar para OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d inscrição exportada" msgstr[1] "%(count)d inscrições exportadas" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Sua lista de podcasts foi exportada com sucesso." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Não foi possivel exportar para o aquivo OPML. Por favor verifique suas " "permissões." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Exportação para OPML falhou" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "Nenhuma atualização disponível" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "Você possui a última versão do gPodder." #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "Nova versão disponível" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "Versão instalada: %s" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "Versão mais nova: %s" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "Data de lançamento: %s" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "Baixar a última versão do gpodder.org?" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Sobre gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Doar / Lista de desejos" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Reportar um problema" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Eduardo Maroja - Stuffmail@gmail.com" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Tradução por:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Agradecimentos a:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Por favor escolha um episódio da lista para exibir suas informações" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Nenhum episódio selecionado" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Não foi possível iniciar o gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Erro de D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "De %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Inteiro" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flutuante" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boleano" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Texto" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "Registrar" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "Flattred" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicado em %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "reproduzido" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "não reproduzido" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "hoje" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "baixado %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Removido" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Novo episódio" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episódio baixado" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episódio de vídeo baixado" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagem baixada" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Arquivo baixado" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "arquivo faltando" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "nunca exibidos" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "nunca reproduzido" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "nunca aberto" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "exibido" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "aberto" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "remoção impedida" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Todos os episódios" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "De todos os podcasts" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Inscrição pausada" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nada para colar" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Area de transferência esta vazia" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Login" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Novo usuário" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Login" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Autenticação requerida" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Senha" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Selecione destino" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Configurações" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Escolha para" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Não foi possivel mudar de %(field)s para %(value)s.é precido o tipo de dado: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Erro ao alterar a opção" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Não faça nada" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Exibir a lista de episódios" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Adicionar à lista de downloads" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Baixar imediatamente" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Nenhum" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "Baseado no sistema de arquivos" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "Marcar como reproduzido" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "Excluir do gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "Erro" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "Personalizado (%(format_ids)s)" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Nome" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Duração" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Informação de módulo de extensão" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "Por favor, registre-se com Flattr " #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "Registrar no Flattr" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "Conectado como %(username)s" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "Sair" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "Integração Flattr requer WebKit/Gtk." #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "WebKit/Gtk não encontrado" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "Extensão não pode ser ativada" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Informação de módulo de extensão" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurar o reprodutor de áudio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Comando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurar reprodutor de vídeo" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manualmente" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "depois de %(count)d dia" msgstr[1] "depois de %(count)d dias" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Substituir a lista de inscrições no servidor" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcasts remotos que não foram adicionados localmente serão removidos do " "servidor. continuar?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Selecionar pasta para ponto de montagem" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Selecionar pasta para ponto de montagem" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Pesquisa" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "A URL especificada não provê nenhuma OPML válida" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nenhum feed encontrado" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Não há canais do Youtube que se encaixem nesta busca." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nenhum canal encontrado" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Selecionar tudo" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Desselecionar todos" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nenhuma seleção" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d episódio" msgstr[1] "%(count)d episódios" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "tamanho: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "A fonte em %(url)s não pôde ser atualizada." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Erro ao abrir o player" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "Adicionar seção" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "Nova seção:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Selecione nova capa para o podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Você pode arrastar apenas uma imagem ou URL aqui." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Arraste e solte" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Você pode somente soltar aquivos e URLs http:// aqui." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Nenhum dispositivo configurado" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Por favor configure seu dispositivo no diálogo de preferências." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Não foi possível abrir dispositivo" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Por favor verifique as configurações no diálogo de preferências" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Não há espaço suficiente no dispositivo" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Precisa de espaço livre adicional: %(required_space)s\n" "Você deseja continuar?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Envio efetuado com sucesso." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Erro ao converter o aquivo" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Todos" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Oculto excluído" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Baixado" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Arquivado" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Vídeos" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "Reproduzido parcialmente" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "Downloads não tocados" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "Flattred (%(count)d)" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "Flattr isso (%(count)d)" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "Inicie a sessão do Flattr nas configurações." #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "Flattring episódio..." #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "Não foi possível se conectar Flattr." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Deletar" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Enviando inscrições..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Erro ao enviar:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Atualizar tudo" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Atualizar" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Renomear" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Alterar seção" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "remover inscrição" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Mesclando ações de episódio..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Mesclando ações de episódio (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Remover este podcast e episódios?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Novo nome da seção:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Novo nome:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Excluir este episódio?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marque como novo" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permitir remoção" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Adicionar para lista de reprodução" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Adicionando podcasts..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Não foi possíovel adicionar alguns podcasts" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "Resumir" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Faixa desconhecida" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s em Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "%s faixas publicadas no Soundcloud" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Favorito de %s no Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Trilhas favoritas por %s no Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "Baixador de legendas para TED Talks" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "Baixa legendas em .srt para TED Talks Videos" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "Converter arquivos de vídeo para MP4 para Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "Converte todos os vídeos para um formato compatível com Rockbox" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "Arquivo convertido" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "App Indicator do Ubuntu" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Mostrar um indicador de status na barra superior." #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Mostrar janela principal" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Sair" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Mostrar progresso do download no ícone do Lançador do Unity." #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "Renomear episódios depois de baixar" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "Renomear episódiops para \".\" ao baixar" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Conversão falhou" #: share/gpodder/extensions/video_converter.py:23 #, fuzzy msgid "Transcode video files to avi/mp4/m4v" msgstr "Transcodificar arquivos .ogg para .mp3 usando ffmpeg" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "Converter para %(format)s" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "Conversão falhou" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "Remover arte da capa dos arquivos OGG" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "remove arte de capa de todos os arquivos ogg baixados" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "Remover arte de capa" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "Enfileirar em reprodutores de mídia" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" "Adiciona um menu de contexto para enfileirar episódios em reprodutores de " "mídia instalados" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "Enfileirar em" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "Pesquisar por novos episódios ao iniciar" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "Inicia a pesquisa por novos episódios ao iniciar" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "Normalizar áudio com recodificação" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "Normalizar o volume de arquivos de áudio com normalize-audio" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "Arquivo normalizado" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "Ícone de status para GTK" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "Mostra um ícone de status para ambientes baseados em Gtk," #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "Minimizar no início" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "Minimiza a janela do gPodder na inicialização." #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Conversão falhou" #: share/gpodder/extensions/audio_converter.py:21 #, fuzzy msgid "Transcode audio files to mp3/ogg" msgstr "Transcodificar arquivos .ogg para .mp3 usando ffmpeg" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "Marcar tag em arquivos baixados usando Mutagen" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Adicionar títulos de episódios e podcast para as tags MP3/OGG" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ubuntu Unity Integration" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Mostrar progresso do download no ícone do Lançador do Unity." #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Adicionar um novo podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editor de podcast gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Seção:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Desabilitar atualização de fontes (pausar inscrição)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "Sincronizar com dispositivos reprodutores de MP3" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "Estratégia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Geral" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autenticação HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Login:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Senha:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Localizações" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Baixar para:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Site:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "Título do Site" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avançado" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editor de configuração do gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Procurar por:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Exibir todos" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Verificar por novos episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Baixe novos episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferencias" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Inscrições" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Descubra novos podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Adicionar podcast via url" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importar de um arquivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportar para arquivo OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Ir para gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Reproduzir" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Abrir" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Alterar status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Mudar a proteção de remoção" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "E_xtras" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "Sincronizar com dispositivo" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "E_xibir" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "\"Todos episódios\" na lista de podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Usar seções para lista de podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Barra de ferramentas" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descrição do episódio" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Esconder episódios excluídos" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episódios baixados" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Esconder podcasts sem episódios" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Ajuda" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manual do usuário" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "Atualizações de softwares" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtro:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcasts" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limite a taxa de download a" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limite o download a" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Selecione os episódios" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "Começando" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "Bem-vindo ao gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "Seu podcast está vazio." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Escolha de uma lista de exemplos de podcasts" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "Adicionar um podcast informando sua URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "Restaurar minhas inscrições do gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Player de Audio" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Player de vídeo" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "Formato preferido de vídeo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensões" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "Flattr episódios automaticamente ao reproduzir" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Sincronizar inscrições e ações de episódios" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Substituir a lista de inscrições do servidor com a lista local" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Nome do dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalo de atualização:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Número máximo de episódios por podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Quando novos episódios forem encontrados:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Atualizando" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Excluir episódios reproduzidos:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Remover episódios reproduzidos mesmo se não finalizados" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Também remover episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Limpeza" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Tipo de dispositivo:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Ponto de montagem:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Depois de sincronizar um episódio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Substituir a lista no servidor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Lista de reprodução vazia" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Somente sincronizar episódios não reproduzidos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispositivos" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editar configuração" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Ache novos podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Selecione todos" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Desselecione todos" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Busca" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Top _podcasts" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_Youtube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Agora tocando" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Adicionando podcasts" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Configurações" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Sobre" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Agradecimentos" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Créditos" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Nome do dispositivo" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "Configurações do gPodder" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Orientação da janela" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Rotação automática" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "Indexação de mídia" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "Mostrar podcasts no Music app" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "Flattr automaticamente ao reproduzir" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Habilitar sincronização" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Conectar ao gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Substituir a lista no servidor" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Nenhuma conta? Registre aqui" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Tocar a lista" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "Lista de reprodução vazia" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalhes do episódio " #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "Baixar episódios" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "Reprodução de episódios" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Notas do Episódio" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "Selecionar baixados" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "Inverter seleção" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Nenhum podcast." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Adiciona seu primeiro podcast agora." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Nenhum episódio" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Toque para alterar o filtro" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Mostrar episódios" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Termo de pesquisa ou URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Lista de melhores" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Meu gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Exemplos" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "powered by gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Inscrever-se" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minuto" msgstr[1] "%(count)s minutos" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s segundo" msgstr[1] "%(count)s segundos" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Data de lançamento: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Atualização do podcast exigida por extensões." #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Download de episódio exibido por extensões." #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "Url inválida: %s" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Você não está inscrito a %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Não foi possível se inscrever a %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Não foi possível se inscrever a %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s adicionado com sucesso." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Essa opção de configuração não existe." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "Só é possível definir nós de configuração de folha." #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Renomeado %(old_title)s para %(new_title)s." #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Desinscreveu de %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Atualizações desabilitadas" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d novo episódio" msgstr[1] "%(count)d novos episódios" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "Verificando por novos espisódios" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Pulando %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Desabilitando atualização de feed de %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Habilitando atualização de feed de %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Ouvindo em TODAS as interfaces de rede." #: bin/gpo:622 msgid "No podcasts found." msgstr "Nenhum podcast encontrado." #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Digite o índice para se inscrever, ? para listar" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Valor inválido." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "URL inválida: %s" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "URL alterada de %(old_url)s para %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Erro de sintáxe: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Comando ambíguo. Você quis dizer..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "A função chamada não está disponível." #: bin/gpodder:108 msgid "print logging output on the console" msgstr "imprime a saída de logs para o console" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "usa a interface gráfica Meego 1.2 Harmattan, baseada em QML" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "assina ao feed da URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Número de processo de aplicativo do Mac OS X" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "Cliente de podcast gPodder" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Cliente de podcast" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Inscrever ao conteúdo de áudio e vídeo da web" #~ msgid "Convert .flv files from YouTube to .mp4" #~ msgstr "Converter aquivos .flv do YouTube para .mp4" #~ msgid "Useful for playing downloaded videos on hardware players" #~ msgstr "Útil para tocar os vídeos baixados nos tocadores de hardware" #~ msgid "Convert FLV to MP4" #~ msgstr "Converter FLV para MP4" #~ msgid "Convert M4A audio to MP3 or OGG" #~ msgstr "Converter áudio M4A para MP3 ou OGG" #~ msgid "Transcode .m4a files to .mp3 or .ogg using ffmpeg" #~ msgstr "Transcodificar os arquivos .m4a para .mp3 ou .ogg usando ffmpeg" #~ msgid "Convert OGG audio to MP3" #~ msgstr "Converter áudio OGG para MP3" #~ msgid "File converted from ogg to mp3" #~ msgstr "Arquivo convertido de ogg para mp3" #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Conversão de ogg or mp3" gpodder-3.5.2/po/ro.po0000644000175000017500000020332712220345607014163 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: LANGUAGE \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1));\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder pe %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "Astăzi" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Ieri" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(necunoscut)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "și" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Utilizatorul a renunțat" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Datele sunt scrise pe disc" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Deschide baza de date iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod este deschis" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Salvează baza de date iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Îndeparteaza %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Adauga %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Eroare la copierea %(episode)s: Nu există suficient spațiu liber pe " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Deschide player MP3" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "Player-ul MP3 deschis" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Eroare la deschiderea %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "Dispozitiv MTP" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Deschide dispozitivul MTP" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s deschis" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Închide %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s închis" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Adaugă %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Adăugat" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Adăugat în coada de așteptare" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Sincronizare" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Gata" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Eșuat" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Sa renunțat" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Întrerupt temporar" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Eroare: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Adaugă %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Îndepărtează %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Nu există abonamente" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Nu există descriere" #: src/gpodder/model.py:679 msgid "unknown" msgstr "necunoscut" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Altele" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Numele sau parola este greșită" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Se descarcă" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Conținutul lipseste de pe server" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Eroare I/O: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Eroare HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Întreg" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Întrerupe descărcarea" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Nu există disponibilă nici o descriere." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Modulul Python \"%s\" nu este instalat" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Linie de comandă: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Aplicația implicită" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Se încarcă descărcările incomplete" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Unele episoade nu au fost descărcate complet într-o sesiune anterioară." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Reia roate descărcările" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Au fost găsite descărcări incomplete dintr-o sesiune anterioară." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Acțiune" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Confirmă modificările de la my.gpodder.org" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Selectează acțiunea dorită" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Încarcă abonamentele" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Abonamentele sunt încărcate pe server" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista a fost încărcată cu succes" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Eroare la încărcare" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Episod" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Mărime" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Publicat" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Progres" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Încarcă episoade" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Nu există episoade în vizualizarea curentă" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Nu există episoade disponibile" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Nu există podcast-uri în aceasta vizualizare" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Nu există abonamente" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Nu se descarcă nimic" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Raportați aceasta problema și reporniți gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Excepție netratată" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Eroare de parser: %s " #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Anumite podcast-uri nu au fost adăugate" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Descărcările sau încheiat" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Descărcările au eșuate" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Anumite podcast-uri nu au fost adăugate" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Dispozitiv sincronizat" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Dispozitiv sincronizat" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detalii despre episod" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Începe descărcările acum" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Descărcare" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Renunță" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Întrerupt temporar" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Elimină din listă" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Actualizează podcast" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Deschide directorul de descărcare" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Marchează episodul ca redat" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 #, fuzzy msgid "Remove podcast" msgstr "Îndepărtează podcast-urile" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Setări podcast" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Eroare de conversie a fișierului." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Transfer fișier prin bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Flux" #: src/gpodder/gtkui/main.py:1775 #, fuzzy msgid "Send to" msgstr "Setați pentru a" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 #, fuzzy msgid "Bluetooth device" msgstr "Selectează tipul de dispozitiv" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Verifică în preferințe setările player-ului media." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Eroare la deschiderea player-ului" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Se adaugă podcast-uri" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Astepta-ți descărcarea informațiilor despre episod." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Abonamente care nu au fost descărcate" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "La aceste podcast-uri există deja abonamente:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Acest podcast necesită autentificare" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Autentificare necesară pentru %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Autentificarea a eșuat" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "A fost detectată o redirecționare a paginii web" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL-ul %(url)s vă trimite la %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Doriți să vizitați pagina de web acum?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Anumite podcast-uri nu au fost adăugate" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Anumite podcast-uri nu au fost adăugate în listă:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Necunoscut" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Sa detectat o redirecționare" #: src/gpodder/gtkui/main.py:2375 #, fuzzy msgid "Merging episode actions" msgstr "Selectați episoadele" #: src/gpodder/gtkui/main.py:2376 #, fuzzy msgid "Episode actions from gpodder.net are merged." msgstr "Descarcă abonamentele de la my.gpodder.org" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Renunțare..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nume nou:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Eroare la aducerea la zi a %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Catalogul %(url)s nu a putut fi actualizat" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Eroare la actualizarea feed-ului" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "%(podcast)s adus la zi (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Nu există episoade noi." #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Episoade noi sunt disponibile" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Închide gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Se descarcă episoade. Pute-ți continua descărcarea cănd reporniți gPodder." #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Episoadele sunt blocate" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Episoadele alese sunt blocate. Deblocați episoadele înainte de a putea sa le " "ștergeți." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2595 #, fuzzy msgid "Deleting episodes removes downloaded files." msgstr "Selectați episoadele care trebuie îndepărtate de pe dispozitiv." #: src/gpodder/gtkui/main.py:2600 #, fuzzy msgid "Deleting episodes" msgstr "Selectați episoadele" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Așteptați până când episoadele au fost șterse." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Selectează episoadele ascultate" #: src/gpodder/gtkui/main.py:2656 #, fuzzy msgid "Select finished" msgstr "Nu selecta nimic" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Selectează episoadele ce trebuie șterse:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 #, fuzzy msgid "Delete episodes" msgstr "Îndepărtează episoadele vechi" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Nici un podcast nu a fost selectat" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Selecteaza un podcast din listă, ce trebuie adus la zi." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Eroare la descărcarea %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Eroare la descărcare" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Selectează episoadele ce trebuie descărcate:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Marcheaza ca vechi" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Verifică dacă există episoade noi mai târziu. " #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Nu există episoade noi" #: src/gpodder/gtkui/main.py:2937 #, fuzzy msgid "Login to gpodder.net" msgstr "Mergi la gpodder.org" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 #, fuzzy msgid "Subscriptions on gpodder.net" msgstr "Abonamente încărcate." #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Selectează un podcast din listă pentru a fi editat." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Îndepărtează podcast-urile" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Selectați podcast-ul dorit pentru a fi șters" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Îndepărtează" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Îndepărtează podcast-ul" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Așteptați până la îndepărtarea podcast-ului." #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Doriți să îndepărtați acest podcast împreună cu toate episoadele?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Se îndepărtează podcast-uri" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Așteptați până la îndepărtarea podcast-ului" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Doriți să îndepărtați acest podcast împreună cu toate episoadele?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Selectează un podcast din listă pentru a fi îndepartat." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Fișiere OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Importă din OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importă podcast-uri din fișiere OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Nimic de exportat" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Lista de abonamente pentru podcast-uri este goală. Abonează-te la podcast-" "uri înainte de a încerca să exporți lista." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Export către OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Lista de podcast-uri a fost exportată cu success." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Nu s-a putut exporta OPML în fișier. Verificați permisiunea." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Exportul OPML a eșuat" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Nu există episoade disponibile" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Episoade noi sunt disponibile" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Se șterg: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "Publicat: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Descarcă abonamentele de la my.gpodder.org" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Închide gPodder" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Lista Amazon" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Raportează probleme" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "translatori" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Selectați un episod din listă pentru a afisa informații despre el." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Nici un episod nu a fost selectat" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "gPodder nu poate fi pornit" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Eroare D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "de către %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Întreg" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Virgulă mobilă" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Binar" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Șir de caractere" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "publicat %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "derulat" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "nederulat" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "Astăzi" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "descărcate %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Șters" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Episod nou" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Episoade descărcate" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Episoade video descărcate" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Imagine descărcată" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Fișier descărcat" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "fișier lipsă" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "niciodată afișat" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "niciodată ascultat" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "niciodată deschis" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "afișat" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "deschis" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "ștergere prevenită" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Toate episoadele" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "din toate podcast-urile" #: src/gpodder/gtkui/model.py:626 #, fuzzy msgid "Subscription paused" msgstr "A_bonamente" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Nimic de lipit" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Tabelul de lipire este gol" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Nume utilizator" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Utilizator nou" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Înregistrare" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Este necesară autentificarea" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Parolă" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Selectează destinația" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Setare" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Setați pentru a" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Nu poate fi setată %(field)s la %(value)s. Este necesar tipul de dată:" "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Eroare la setarea opțiunii %s" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Nimic" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Afișează lista cu episoade" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Adaugă în lista de descărcări" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Descarcă imediat" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Nimic" #: src/gpodder/gtkui/desktop/preferences.py:72 #, fuzzy msgid "Filesystem-based" msgstr "MP3 player bazat pe sistem de fișiere" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Marcat ca neascultat" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Șterge episodul din gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Eroare: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Șiruri de caractere specifice" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Configurează playerul audio" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Linie de comandă:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Configurează playerul video" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manual" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Înlocuiește lista de abonamente pe server" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Podcast-uri remote care nu au fost adăugate local vor fi îndepărtate de pe " "server. Continuați?" #: src/gpodder/gtkui/desktop/preferences.py:622 #, fuzzy msgid "Select folder for mount point" msgstr "Selecta-ți locul de montare al iPod-ului." #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Selecta-ți locul de montare al iPod-ului." #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 #, fuzzy msgid "Search" msgstr "Caută după:" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "URL-ul specificat nu conține nici un podcast de tip OPML valid." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Nu a fost găsit nici un feed." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Nu există canale YouTube care să corespundă acestei interogări" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Nu a fost găsit nici un canal" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Selectează totul" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Nu selecta nimic" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Nimic nu este selectat" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "mărime: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Catalogul %(url)s nu a putut fi actualizat" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Eroare la deschiderea player-ului" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Acțiune" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nume nou:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Selectează o noua copertă pentru podcast" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Nu puteți folosi decât un singură o imagine sau URL aici." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Drag and drop" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" "În acest loc nu puteți folosi decât fișiere locale și URL-uri de tip http:// " #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Nici un dispozitiv configurat" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Seta-ți dispozitivul în dialogul \"Preferințe\"." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Dispozitivul nu a putut fi citit" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Verificați setările din dialogul \"Preferințe\"." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Nu există suficient spațiu pe dispozitiv" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Trebuie eliberat %s\n" "Doriți să continuați?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lista a fost încărcată cu succes" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Eroare de conversie a fișierului." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Tot" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Ascunde episoadele șterse" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Descărcate" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Toate episoadele" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Marcat ca neascultat" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "descărcare neredată" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "după %d zi" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "după %d zi" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Selectați episoadele" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Șterge" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Încarcă abonamentele" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Eroare la încărcare" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Adu la zi totul" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Adu la zi totul" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 #, fuzzy msgid "Rename" msgstr "Nume utilizator" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Inversează selecția" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Întrerupe abonamentul" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Selectați episoadele" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Selectați episoadele" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Îndepărtează podcast-uri si episoade?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Nume nou:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Nume nou: %s" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Îndepărtează episoadele vechi" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Marcat ca nou" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Permite ștergerea" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Player audio:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Se adaugă podcast-uri" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Anumite podcast-uri nu au fost adăugate" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Reia roate descărcările" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Piesă necunoscută" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s pe Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Piese publicate de %s în Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, fuzzy, python-format msgid "%s's favorites on Soundcloud" msgstr "%s pe Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, fuzzy, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Piese publicate de %s în Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "Convertor OGG pentru iPod" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Ieșire" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "Un episod nou este disponibil pentru descărcare" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Un episod nou este disponibil pentru descărcare" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Eroare de conversie a fișierului." #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Eroare de conversie a fișierului." #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Selectează coperta dintre fișiere" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Îndepartează semnul \"nou\"" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Caută episoade noi la pornire" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Caută episoade noi la pornire" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Numele fișierului" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Eroare de conversie a fișierului." #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Arată \"Toate episoadele\" în lista cu podcast-uri" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Adaugă un nou podcast" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Editorul de podcast-uri gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 #, fuzzy msgid "Section:" msgstr "Acțiune" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 #, fuzzy msgid "Disable feed updates (pause subscription)" msgstr "Activează aduceri la zi euristice ale feed-ului" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Sincronizează cu player-ul" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Șterge strategia:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "General" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "Autentificare HTTP/FTP" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Nume utilizator:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Parola:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Locații" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Descarcă pe:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Pagină web:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "eticheta paginii de web" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avansat" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Editorul de configurații gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Caută după:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Afișează toate" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcast" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Caută episoade noi" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Descarcă episoade noi" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Preferințe" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "A_bonamente" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Caută podcasturi noi" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Adaugă podcast via URL" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importă din fișier OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportă în fișier OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Episoade" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Redare" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Deschide" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Dezactivează blocare la ștergere " #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Sincronizează dispozitivul" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Vizualizare" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Arată \"Toate episoadele\" în lista cu podcast-uri" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Eroare la salvarea listei de podcast-uri" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Arată bara cu unelte" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Descrierea episoadelor" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Ascunde episoadele șterse" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Episoade descărcate" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Episoade ne-redate" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ascunde podcast-uri fără episoade" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Ajutor" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Manualul utilizatorului" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtru:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcast-uri" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Limitează rata la" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Limitează descărcările la" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Selectați episoadele" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Setare" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Bine ați venit la gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Lista de podcast-uri este goală. Ce doriți să faceți" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Selectează dintr-o lista de exemple cu podcast-uri" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Adaugă podcast via URL" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Descarcă abonamentele de la my.gpodder.org" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Player audio:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Player video:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Descarcă întotdeauna episoade noi automat" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Înlocuiește lista de pe server cu abonamentele locale" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 #, fuzzy msgid "Device name:" msgstr "Nume dispozitiv:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 #, fuzzy msgid "gpodder.net" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Intervalul de actualizare:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Numărul maxim de episoade per podcast:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Când se găsesc episoade noi:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Actualizează" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 #, fuzzy msgid "Delete played episodes:" msgstr "Îndepărtează episoadele redate" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Îndepărtează podcast-urile de pe dispozitiv" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Îndepărtează de asemenea episoadele neredate" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Curăță" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 #, fuzzy msgid "Device type:" msgstr "Nume dispozitiv:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 #, fuzzy msgid "Mountpoint:" msgstr "loc de montare pentru iPod:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 #, fuzzy msgid "After syncing an episode:" msgstr "Se deschide %d episod" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Înlocuiește lista de abonamente pe server" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Numele listei de redare:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 #, fuzzy msgid "Only sync unplayed episodes" msgstr "Episoade ne-redate" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Dispozitive" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Editează configurarea" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Caută podcast-uri noi" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Selectează totul" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Nu selecta nimic" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Căutare" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Topul _podcast-urilor" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Se adaugă podcast-uri" #: share/gpodder/ui/qml/main_default.qml:41 #, fuzzy msgid "Settings" msgstr "Setare" #: share/gpodder/ui/qml/main_default.qml:143 #, fuzzy msgid "About" msgstr "Despre" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Nume dispozitiv:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "Setări my.gPodder.org" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Orientarea ecranului" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Curățare automată" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Nu există podcast-uri în aceasta vizualizare" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Continuă redarea" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "După sincronizare:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Înlocuiește lista de abonamente pe server" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Redat" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Numele listei de redare:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detalii despre episod" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Episoade descărcate" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Redă episodul" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Descrierea emisiunii..." #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Selectează directorul pentru descărcare" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Inversează selecția" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Nici un podcast" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Nu există episoade noi." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Afișează lista cu episoade" #: share/gpodder/ui/qml/Subscribe.qml:53 #, fuzzy msgid "Search term or URL" msgstr "Caută după:" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "Exemple de podcast" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Mergi la gpodder.org" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Abonează-te" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "Publicat: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "Publicat: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Acest podcast necesită autentificare" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "La aceste podcast-uri există deja abonamente:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Nu se poate sincroniza dispozitivul iPod" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Nu se poate sincroniza dispozitivul iPod" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Întrerupe abonamentul" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Adu la zi selecția" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Caută episoade noi" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Se adaugă podcast-uri" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Citește fișiere de pe %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Nu a fost găsit nici un podcast" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Această funcționalitate nu există pentru iPod." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Tipărește informațiile de depanare pe stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "Editorul de podcast-uri gPodder" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Lista cu podcast-uri" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Convertor OGG pentru iPod" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Eroare de conversie a fișierului." #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Vă rugam așteptați..." gpodder-3.5.2/po/ru.po0000644000175000017500000034515312220345610014167 0ustar thpthp00000000000000# gPodder translation template. # Copyright (C) 2006 Thomas Perl # This file is distributed under the same license as the gPodder package. # Thomas Perl , 2006. # msgid "" msgstr "" "Project-Id-Version: gPodder 2.10+git\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2010-11-24 21:55+0300\n" "Last-Translator: Maxim Prohorov \n" "Language-Team: \n" "Language: \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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder на %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "Один день назад" msgstr[1] "%(count)d дня назад" msgstr[2] "%(count)d дней назад" #: src/gpodder/util.py:495 msgid "Today" msgstr "Сегодня" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Вчера" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(неизвестно)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "Одна секунда" msgstr[1] "%(count)d секунды" msgstr[2] "%(count)d секунд" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "один час" msgstr[1] "%(count)d часа" msgstr[2] "%(count)d часов" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "Одна минута" msgstr[1] "%(count)d минуты" msgstr[2] "%(count)d минут" #: src/gpodder/util.py:1245 msgid "and" msgstr "и" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Отменено пользователем" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Запись на диск" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Открытия базы данных iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod открыт" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Сохранение базы данных iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Запись в базу данных gtkpod" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Удаление %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Добавление %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Ошибка при копировании %(episode)s: Недостаточно свободного места на " "%(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Открытие MP3 плеера" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 плеер открыт" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Ошибка открытия %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP устройство" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Открытие MTP устройства" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s открыто" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Закрытие %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s закрыто" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Добавление %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Добавлено" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "В очереди" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Синхронизация" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Завершено" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Ошибка" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Отменено" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Остановлено" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Ошибка: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Добавление %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Удалить %s?" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Нет подписок" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Нет описания" #: src/gpodder/model.py:679 msgid "unknown" msgstr "неизвестно" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Другое" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Видео" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Аудио" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Неверное имя пользователя/пароль" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Загрузка" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Отсутствуют данные с сервера" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Ошибка ввода/вывода: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "Ошибка HTTP %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Целое" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Приостановить загрузку." #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Нет описания." #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python module \"%s\" not installed" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Команда: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Приложение по-умолчанию" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Возобновление загрузки" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" "Со времени предыдущего запуска программы остались незавершённые загрузки." #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "Один незавершённый файл" msgstr[1] "%(count)d незавершённых файла" msgstr[2] "%(count)d незавершённых файлов" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Возобновить" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Некоторые загрузки были не завершены." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Действие" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Сохранить изменения с gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Выберите подкасты для удаления." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Сохранение подпискок" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Подписки загружены на сервер." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Список успешно сохранен." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Ошибка при загрузке" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Выпуск" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Размер" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Продолжительность" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Вышел" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Видимые колонки" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Прогресс" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Загрузка выпусков" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Нет выпусков для отображения" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Нет доступных выпусков" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Нет подкастов" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Нет подписок" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Нет активных загрузок" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "одна активная" msgstr[1] "%(count)d активных" msgstr[2] "%(count)d активных" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "ошибка" msgstr[1] "%(count)d ошибки" msgstr[2] "%(count)d ошибок" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "одна в очереди" msgstr[1] "%(count)d в очереди" msgstr[2] "%(count)d в очереди" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "загрузка файла" msgstr[1] "загрузка %(count)dх файлов" msgstr[2] "загрузка %(count)dти файлов" #: src/gpodder/gtkui/main.py:1151 #, fuzzy, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "загрузка файла" msgstr[1] "загрузка %(count)dх файлов" msgstr[2] "загрузка %(count)dти файлов" #: src/gpodder/gtkui/main.py:1153 #, fuzzy, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "одна в очереди" msgstr[1] "%(count)d в очереди" msgstr[2] "%(count)d в очереди" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Пожалуйста сообщите об этой ошибке и перезапустите gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Unhandled exception" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Ошибка Feedparser: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Невозможно добавить подкасты" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Загрузки выполнены" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Ошибка" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Невозможно добавить подкасты" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Устройство синхронизировано" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Устройство синхронизировано" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "Один выпуск" msgstr[1] "%(count)d выпуска" msgstr[2] "%(count)d выпусков" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Детали выпуска" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Загрузить сейчас" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Загрузка" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Отмена" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Пауза" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Удалить" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Обновить подкаст" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Открыть каталог загрузок" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Отметить выпуск как прослушанный" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Архив" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Удалить подкаст" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Настройки подкаста" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Ошибка конвертации" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Передача файлов по Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Превью" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Поток" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Отправить" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Каталог" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Новый" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Проверьте настройки вашего устройства" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Ошибка открытия устройства" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Добавление подкастов" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Загружается информация о выпуске" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Существующие подписки пропущены" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Вы уже подписаны на эти подкасты:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Для доступа необходима аутентификация" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Войдите в %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Ошибка аутентификации" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Замечено перенаправление" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "%(url)s ссылается на %(target)s. " #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Продолжить?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Невозможно добавить подкасты" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Эти подкасты не были добавлены:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Неизвестно" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Перенаправление" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Синхронизация действий" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Действия над эпизодами синхронизированы." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Отменяется..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Новое имя:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Обновление %(count)d..." msgstr[1] "Обновление %(count)d..." msgstr[2] "Обновление %(count)d..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Ошибка обновления %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Подписка %(url)s не может быть обновлена." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Ошибка при обновлении подписки" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Обновление %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Нет новых выпусков" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Загрузка нового выпуска." msgstr[1] "Загрузка %(count)dх новых выпусков." msgstr[2] "Загрузка %(count)dти новых выпусков." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Доступны новые выпуски" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "Новый выпуск доступен для загрузки" msgstr[1] "%(count)d новых выпуска доступны для загрузки" msgstr[2] "%(count)d новых выпусков доступно для загрузки" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "Новый выпуск" msgstr[1] "%(count)d новых выпуска" msgstr[2] "%(count)d новых выпусков" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Выход" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Есть активные загрузки. Они могут быть продолжены при следующем запуске " "gPodder. Выйти?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Выпуски защищены от удаления" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Вы не можете удалить эти выпуски. Отключите запрет в настройках выпусков/" "подкаста. " #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Удалить выпуск?" msgstr[1] "Удалить выпуски (%(count)d)?" msgstr[2] "Удалить выпуски (%(count)d)?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Загруженные файлы будут удалены" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Удаление выпусков" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Подождите, выпуски удаляются" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Выбрать старше чем один день" msgstr[1] "Выбрать старше чем %(count)d дня" msgstr[2] "Выбрать старше чем %(count)d дней" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Выбрать прослушанные" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Выбрать завершенные" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Выпуски для удаления:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Удалить выпуски" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Не выбрано подкастов" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Подкасты для обновления" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Произошла ошибка при загрузке %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Ошибка загрузки" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Отметьте выпуски для загрузки:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Уже прослушано" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Проверьте новые выпуски позже" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Нет новых выпусков" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Зайти на gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Авторизуйтесь, чтобы загрузить подписки" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Подписки на gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Выберите подкасты для редактирования." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Подкаст" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Удалить подкасты" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Выберите подкасты для удаления." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Удалить" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Удаление подкаста" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Подкаст удаляется" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Действительно удалить подкаст и все загруженные выпуски?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Удаление подкастов" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Подкасты удаляются" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Действительно удалить подкасты и все загруженные выпуски?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Выберите подкасты для удаления." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Файлы OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Импорт из OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Импорт подкастов из OPML" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Нечего экспортировать" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "Ваш список подписок пуст. Добавьте подкасты перед экспортом." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Экспорт в OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "Подписка экспортирована" msgstr[1] "%(count)d подписки экспортированы" msgstr[2] "%(count)d подписок экспортировано" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Ваши подписки успешно экспортированы." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Ошибка экспорта в OPML файл. Проверьте права на чтение/запись." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Ошибка экспорта" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Нет доступных выпусков" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Доступны новые выпуски" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Удаление: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "выпущен: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Загрузить мои подписки с gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Выход" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Подарки разработчику" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Сообщить об ошибке" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" "Переводчики \n" "\n" "Владимир Земляков \n" "\n" "Леонид PhoeniX Пономарев \n" "Максим Jaah Прохоров " #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Переведено:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Благодарности:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Выберите выпуск для показа деталей (шоунотов)" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Выпуски не выбраны" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Ошибка запуска gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Ошибка D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "от %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Целое" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "С плавающей запятой" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Булево" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Строка" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "выпущен %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "прослушан" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "не прослушан" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "сегодня" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "загружен %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Удалено" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Новый выпуск" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Загруженный выпуск" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Загруженный видео-выпуск" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Загруженное изображение" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Загруженный файл" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "файл не найден" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "не просмотрено" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "никогда" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "никогда" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "просмотрено" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "открыто" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "удаление не возможно" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Все выпуски" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "из всех подкастов" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Подписка приостановлена" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Нечего" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Буфер обмена пуст" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Имя пользователя" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Новый пользователь" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Зайти" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Необходима аутентификация" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Пароль" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Направление" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Опции" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Значение" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Невозможно установить %(field)s как %(value)s. Требуемый тип выражения: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Ошибка установки параметра" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Ничего не делать" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Показать список выпусков" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Добавить в список загрузок" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Загрузить немедленно" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Нет" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "С файловой системой" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Ещё не прослушано" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Удалить выпуск" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Ошибка: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Имя файла" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Продолжительность" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 #, fuzzy msgid "Support the author" msgstr "Поддержка gPodder" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Настроить аудио плеер" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Команда:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Видео плеер:" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "вручную" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "на следующий день" msgstr[1] "через %(count)d дня" msgstr[2] "через %(count)d дней" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Перезаписать список подписок на сервере" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Подписки на сервере, не сохраненные локально, будут безвозвратно утеряны. " "Продолжить?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Укажите точку монтирования" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Выберите директорию MP3 плеера" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Поиск" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Не найдено подкастов по ссылке." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Не найдено подписок" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Нет каналов YouTube, соответствующих этому запросу" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Каналы не найдены" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Выделить все" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Сброс выбора" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ничего не выбрано" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "Один выпуск" msgstr[1] "%(count)d выпуска" msgstr[2] "%(count)d выпусков" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "размер: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "Каталог %s не может быть создан." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "Ошибка записи плейлиста" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Действие" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Новое имя:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Выберите новую обложку для подкаста" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Вы можете вставить только одно изображение или ссылку на него." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Перетащить" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" "Только локальные (file://) и интернет (http://) ссылки доступны для " "перетаскивания" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Устройство не настроено" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Укажите ваше устройство в разделе \"Устройство\" настроек gPodder" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Невозможно открыть устройство" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Проверьте настройки устройства" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Недостаточно свободного места на устройстве" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Необходимо освободить %s \n" "на устройстве. Продолжить?" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "Обновление завершено" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "Плейлист устройства обновлен" #: src/gpodder/gtkui/desktop/sync.py:274 #, fuzzy msgid "Episodes have been deleted on device" msgstr "Новые выпуски доступны для загрузки" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Ошибка записи файла плейлиста" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Все" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Скрыть удаленные выпуски" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Загружено" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Архив" #: src/gpodder/qmlui/__init__.py:71 #, fuzzy msgid "Videos" msgstr "Видео" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Ещё не прослушано" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "не прослушано" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "на следующий день" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "на следующий день" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Удаление выпусков" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Невозможно отправить список" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Удалить" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Сохранение подпискок" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Ошибка при загрузке" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Обновить все" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Обновить все" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Переименовать" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Инвертировать выбор" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Удалить" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Синхронизация действий" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Синхронизация действий" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Удалить подкаст и выпуски?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Новое имя:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Новое имя: %s" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Удалить выпуски" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Отметить как новый" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Позволить удаление" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Аудио плеер:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Добавление подкастов" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Невозможно добавить подкасты" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Возобновить" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Неизвестно" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s на Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Композиции %s на Soundcloud" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "Избранное %s на Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Избранные треки %s на Soundcloud" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "Конвертация OGG для iPod" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Выход" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "Новый выпуск доступен для загрузки" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Новый выпуск доступен для загрузки" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Ошибка конвертации" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Ошибка конвертации" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Установить обложку из файла" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Удалить " #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Проверять наличие новых выпусков при запуске" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Проверять наличие новых выпусков при запуске" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Файл" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Ошибка конвертации" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Показывать выпуски из всех подкастов" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Добавить новый подкаст" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Ссылка:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Редактор подкастов gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 #, fuzzy msgid "Section:" msgstr "Действие" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Приостановить обновление подписки" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Синхронизация " #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Способ удаления:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Основное" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP Аутентификация" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Пользователь:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Пароль:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Месторасположения" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Загружать в:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Сайт:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "Заголовок сайта" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Дополнительно" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Редактор Настроек gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Искать: " #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Показать все" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Подкасты" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Проверить обновления" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Загрузить новые выпуски" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Настройки" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "П_одписки" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Поиск подкастов" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Добавить по ссылке" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Импорт из OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Экспорт в OPML" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Открыть gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Выпуски" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Воспроизвести" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Открыть" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Установить новый статус" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Возможность удаления" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Синхронизация с устройством" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "В_ид" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Показывать выпуски из всех подкастов" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Ошибка сохранения" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Панель инструментов" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Детали выпуска(шоуноты)" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Скрыть удаленные выпуски" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Загруженные выпуски" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Не прослушанные выпуски" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Скрыть подкасты без выпусков" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Справка" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Руководство" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Фильтр:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Подкасты" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Огр. скорость" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "КиБ/с" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Макс. активных" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Выбрать выпуски" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Настройки" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Добро пожаловать в gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "У вас нет подписок. Что вы хотите сделать?" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Выбрать из списка примеры подкастов" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Добавить по ссылке" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Загрузить мои подписки с gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Аудио плеер:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Видео плеер:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Всегда загружать новые выпуски" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Синхронизировать подписки и действия над ними" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Сохранить список подписок на сервере" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Имя устройства:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Период обновления:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Ограничить количество выпусков в подкасте:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Когда найдены новые выпуски:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Обновление" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Удалить прослушанные выпуски:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Удалять прослушанные выпуски с устройства" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Также удалить не прослушанные" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Очистка" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Тип устройства:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Путь к устройству:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "После синхронизации выпуска:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Удалить подкасты с устройства?" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Название плейлиста:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 #, fuzzy msgid "Remove episodes deleted on device from gPodder" msgstr "Удалять из gPodder выпуски, прослушанные на iPod " #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Не синхронизировать прослушанные выпуски" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Устройства" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Расширенные" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Найти подкасты" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Выбрать все" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Отмена выбора" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Поиск" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "_Топ Подкастов" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Проигрывается сейчас" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Добавить новый подкаст" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Настройки" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "О программе" #: share/gpodder/ui/qml/main_default.qml:168 #, fuzzy msgid "Thanks" msgstr "Благодарности:" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Имя устройства:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "Настройки gPodder.net" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Ориентация дисплея" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Автоматически очищать" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Нет подкастов" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Продолжить" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "После синхронизации:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Зайти на gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Перезаписать список подписок на сервере" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Прослушан" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Название плейлиста:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Детали выпуска" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Загруженные выпуски" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Прослушать выпуск" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Шоуноты" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Загружать в" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Инвертировать выбор" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Нет подкастов" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Нет новых выпусков" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Показать список выпусков" #: share/gpodder/ui/qml/Subscribe.qml:53 #, fuzzy msgid "Search term or URL" msgstr "Искать: " #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Топ-лист" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "Примеры подкастов" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Открыть gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Подписка" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, fuzzy, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "Одна минута" msgstr[1] "%(count)d минуты" msgstr[2] "%(count)d минут" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, fuzzy, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "Одна секунда" msgstr[1] "%(count)d секунды" msgstr[2] "%(count)d секунд" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "выпущен: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "выпущен: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Для доступа необходима аутентификация" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Вы уже подписаны на эти подкасты:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Вы уже подписаны на эти подкасты:" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Синхронизация с iPod невозможна" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Удалить" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Обновить выбранное" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "один новый выпуск" msgstr[1] "%(count)d новых выпуска" msgstr[2] "%(count)d новых выпусков" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Поиск новых выпусков..." #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Добавление подкастов" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Чтение файлов из %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Нет подкастов" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Эта возможность недоступна для iPod." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Отладочная информация в stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Подписаться на данную ссылку" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "номер процесса Mac OS X аппликации" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "Редактор подкастов gPodder" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Список подкастов" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Подписаться на аудио и видео контенгент сайта" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Конвертация OGG для iPod" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Ошибка конвертации" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Подождите пожалуйста..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Запустить QML интерфейс" #~ msgid "Loading shownotes..." #~ msgstr "Загрузка шоунотов..." #~ msgid "_Download" #~ msgstr "_Загрузка" #~ msgid "C_ancel download" #~ msgstr "О_тмена загрузки" #, fuzzy #~ msgid "Context menu" #~ msgstr "Закрыть" #, fuzzy #~ msgid "%(count)s podcast selected" #~ msgid_plural "%(count)s podcasts selected" #~ msgstr[0] "выбран подкаст" #~ msgstr[1] "выбрано %(count)d подкаста" #~ msgstr[2] "выбрано %(count)d подкастов" #, fuzzy #~ msgid "Flattr" #~ msgstr "Очистка" #~ msgid "Downloads" #~ msgstr "Загрузки" #~ msgid "These downloads failed:" #~ msgstr "Неудачные загрузки:" #~ msgid "Podcast details" #~ msgstr "Настройки подкаста" #~ msgid "Feed URL:" #~ msgstr "Ссылка:" #~ msgid "Title:" #~ msgstr "Название:" #~ msgid "Cover" #~ msgstr "Обложка" #~ msgid "Go to website" #~ msgstr "Посетить сайт" #~ msgid "OPML/Search:" #~ msgstr "OPML/Поиск:" #~ msgid "Check for Updates" #~ msgstr "Проверить обновления" #~ msgid "gPodder startup assistant" #~ msgstr "Помощник gPodder" #~ msgid "gpodder" #~ msgstr "gpodder" #~ msgid "Your subscription list is empty. What do you want to do?" #~ msgstr "У вас нет подписок. Что вы хотите сделать?" #~ msgid "Start the web interface of gPodder" #~ msgstr "Запустить веб интерфейс" #, fuzzy #~ msgid "Enable gpodder.net syncing" #~ msgstr "Настройки gPodder.net" #, fuzzy #~ msgid "Download list from server" #~ msgstr "Загрузить мой список с gpodder.net" #, fuzzy #~ msgid "Touch here to add a podcast" #~ msgstr "Невозможно добавить подкасты" #~ msgid "A podcast client with focus on usability" #~ msgstr "Практичный подкаст-клиент." #~ msgid "Download if minimized" #~ msgstr "Загрузить, если приложение скрыто" #~ msgid "Enable notification bubbles" #~ msgstr "Всплывающие уведомления " #, fuzzy #~ msgid "Podcast list" #~ msgstr "Список подкастов" #, fuzzy #~ msgid "Loading." #~ msgstr "Загрузить" #~ msgid "%(count)d action processed" #~ msgid_plural "%(count)d actions processed" #~ msgstr[0] "Действие обработано" #~ msgstr[1] "%(count)d действия обработано" #~ msgstr[2] "%(count)d действий обработано" #, fuzzy #~ msgid "Podcast already added" #~ msgstr "Подкаст переименован" #~ msgid "Idle" #~ msgstr "Бездействие" #~ msgid "Hint of the day" #~ msgstr "Полезный совет" #~ msgid "%(count)d paused" #~ msgid_plural "%(count)d paused" #~ msgstr[0] "остановлена" #~ msgstr[1] "%(count)d остановлены" #~ msgstr[2] "%(count)d остановлено" #~ msgid "Opening %s" #~ msgstr "Открытие %s" #~ msgid "Opening %(count)d episode" #~ msgid_plural "Opening %(count)d episodes" #~ msgstr[0] "Открытие выпуска" #~ msgstr[1] "Открытие %(count)dх выпусков" #~ msgstr[2] "Открытие %(count)dти выпусков" #~ msgid "New episodes are available." #~ msgstr "Доступны новые выпуски." #~ msgid "No new episodes. Please check for new episodes later." #~ msgstr "Нет новых выпусков. Проверьте позже." #~ msgid "Updating \"%s\"..." #~ msgstr "Обновление \"%s\"..." #~ msgid "About %s" #~ msgstr "О %s" #~ msgid "Visit website" #~ msgstr "Посетить сайт" #~ msgid "Report bug" #~ msgstr "Сообщить об ошибке" #~ msgid "Donate" #~ msgstr "Пожертвование" #~ msgid "Size: %s" #~ msgstr "Размер: %s" #~ msgid "Resume download" #~ msgstr "Возобновить" #~ msgid "Downloading %s" #~ msgstr "Загрузка %s" #~ msgid "Old episode" #~ msgstr "Старый выпуск" #~ msgid "Unplayed" #~ msgstr "Не прослушан" #~ msgid "Pause subscription" #~ msgstr "Приостановить подписку" #, fuzzy #~ msgid "Archive episodes" #~ msgstr "Все выпуски" #~ msgid "Rename podcast" #~ msgstr "Переименовать" #~ msgid "Podcast renamed: %s" #~ msgstr "Подкаст переименован: %s" #~ msgid "Login to %s" #~ msgstr "Зайти на %s" #~ msgid "Downloading episode" #~ msgstr "Загрузка выпуска" #~ msgid "" #~ "Sign up for gpodder.net to synchronize (and backup) your subscriptions to " #~ "the cloud." #~ msgstr "" #~ "Создайте аккаунт на gpodder.net для синхронизации и резервного " #~ "копирования подписок." #~ msgid "Bulk-deleting episodes is possible from the main window menu." #~ msgstr "" #~ "С помощью пункта меню 'Подписки/Удалить подкасты' можно удалить несколько " #~ "подкастов за раз." #~ msgid "" #~ "To save power, automatic updates are only enabled while gPodder is " #~ "running." #~ msgstr "Автоматическое обновление работает только при запущенном gPodder" #~ msgid "Subscribe to YouTube users and download their videos to your device." #~ msgstr "" #~ "Подпишитесь на RSS-ленту пользователя YouTube и получайте новые видео " #~ "прямо на ваше устройство." #~ msgid "" #~ "Use the shortcut URL yt: to quickly subscribe to a YouTube user." #~ msgstr "" #~ "Используйте короткий URL yt:<имя-пользователя> для того чтобы быстро " #~ "подписаться на пользователя YouTube." #~ msgid "" #~ "Search for your fields of interest in the gpodder.net directory to find " #~ "interesting content." #~ msgstr "Воспользуйтесь каталогом и поиском подкастов на gpodder.net" #~ msgid "" #~ "Longpress on an episode to access a menu with useful episode-related " #~ "functions." #~ msgstr "Нажмите и удерживайте на выпуске для просмотра возможных действий." #~ msgid "" #~ "Longpress on an episode in 'New episodes available' to display its " #~ "shownotes." #~ msgstr "" #~ "В окне загрузки новых выпусков нажмите и удерживайте на выпуске в для " #~ "показа деталей (шоунотов)" #~ msgid "" #~ "Use the hardware keyboard to filter down lists - simply start typing in " #~ "the podcast or episode list." #~ msgstr "" #~ "Используйте клавиатурный ввод чтобы быстро найти нужный выпуск/подкаст. " #~ msgid "" #~ "The top row of the menu in each list window lets you set the filter for " #~ "it." #~ msgstr "Нажав на заголовок столбца вы отсортируете список по нему." #~ msgid "" #~ "Use fb: as a shorthand for Feedburner URLs (feeds.feedburner.com/" #~ ")" #~ msgstr "" #~ "Используйте короткий URL fb:<имя> для подписки на RSS-ленту feeds." #~ "feedburner.com/<имя>" #, fuzzy #~ msgid "" #~ "Episodes marked as 'Archive' will never be displayed in the 'Delete " #~ "episodes' list." #~ msgstr "" #~ "Выпуски защищенные от удаления не будут показываться в диалоге 'Удалить " #~ "выпуски'" #~ msgid "" #~ "Use gpodder.net to share your subscription list with friends via a " #~ "private or public URL." #~ msgstr "" #~ "Поделитесь подкастами из вашего профиля на gpodder.net публичным/" #~ "приватным URL" #~ msgid "" #~ "Found a problem? Report it at bugs.maemo.org (Extras / gPodder), so we " #~ "can fix it in the next release." #~ msgstr "Нашли ошибку? Сообщите о ней на bugs.maemo.org (Extras / gPodder)" #~ msgid "" #~ "Got a feature request? Let us know at bugs.maemo.org (Extras / gPodder)!" #~ msgstr "" #~ "Есть идея как улучшить gPodder? Сообщите о ней на bugs.maemo.org " #~ "(Extras / gPodder)" #~ msgid "" #~ "Want to support gPodder? Use the 'donate' button in the about dialog." #~ msgstr "" #~ "Поддержите gPodder! Нажмите на 'Пожертвование' в диалоге 'О программе'" #~ msgid "" #~ "Use Media Player as your audio and video player for position tracking " #~ "support." #~ msgstr "" #~ "Используйте 'Медиа Плеер' для возможности продолжить слушать подкаст с " #~ "того места на котором он был прерван." #~ msgid "" #~ "The 'Delete episodes' dialog has some useful presets in its menu - check " #~ "them out!" #~ msgstr "" #~ "Вы можете воспользоваться шаблонами действий в диалоге 'Удалить выпуски'" #~ msgid "" #~ "Use search-as-you-type in the 'All episodes' list to quickly find a " #~ "specific episode." #~ msgstr "" #~ "Используйте клавиатурный ввод чтобы быстро найти нужный выпуск/подкаст. " #~ msgid "in downloads list" #~ msgstr "в список загрузок" #~ msgid "%(count)d unplayed download" #~ msgid_plural "%(count)d unplayed downloads" #~ msgstr[0] "один не прослушанный выпуск" #~ msgstr[1] "%(count)d не прослушанных выпуска" #~ msgstr[2] "%(count)d не прослушанных выпусков" #~ msgid "Select a source" #~ msgstr "Источник" #~ msgid "Load OPML file from the web" #~ msgstr "Загрузить OPML файл" #~ msgid "Search on gpodder.net" #~ msgstr "Поиск на gpodder.net" #~ msgid "Open OPML file" #~ msgstr "Открыть файл OPML" #~ msgid "Search YouTube user channels" #~ msgstr "Поиск пользовательских каналов на YouTube" #~ msgid "Podcast feed/website URL" #~ msgstr "Ссылка для подписки" #~ msgid "OPML file from the web" #~ msgstr "OPML файл" #~ msgid "Podcast Top 50" #~ msgstr "Топ 50 подкастов" #~ msgid "Search YouTube users" #~ msgstr "Поиск пользователей YouTube" #~ msgid "Download from gpodder.net" #~ msgstr "Загрузить с gpodder.net" #~ msgid "Loading podcast list" #~ msgstr "Загрузка" #~ msgid "No podcasts found. Try another source." #~ msgstr "Нет подкастов. Попробуйте другой источник." #~ msgid "Automatic" #~ msgstr "Автоматически" #~ msgid "Landscape" #~ msgstr "Альбомный" #~ msgid "Portrait" #~ msgstr "Портретный" #~ msgid "Manually" #~ msgstr "Вручную" #~ msgid "Every %(count)d minute" #~ msgid_plural "Every %(count)d minutes" #~ msgstr[0] "Каждую минуту" #~ msgstr[1] "Каждые %(count)d минуты" #~ msgstr[2] "Каждые %(count)d минут" #~ msgid "Hourly" #~ msgstr "Ежечасно" #~ msgid "Every %(count)d hour" #~ msgid_plural "Every %(count)d hours" #~ msgstr[0] "Каждый час" #~ msgstr[1] "Каждые %(count)d часа" #~ msgstr[2] "Каждые %(count)d часов" #~ msgid "Daily" #~ msgstr "Ежедневно" #, fuzzy #~ msgid "Download when on Wi-Fi" #~ msgstr "загрузка файла" #~ msgid "Media Player" #~ msgstr "Медиа Плеер" #~ msgid "Panucci" #~ msgstr "Panucci" #~ msgid "MediaBox" #~ msgstr "MediaBox" #~ msgid "MPlayer" #~ msgstr "MPlayer" #~ msgid "Show \"All episodes\" view" #~ msgstr "Показывать выпуски из всех подкастов" #~ msgid "Text copied to clipboard." #~ msgstr "Текст скопирован." #~ msgid "Change played status" #~ msgstr "Статус выпуска" #~ msgid "Edit username/password" #~ msgstr "Имя пользователя/пароль" #~ msgid "Reload cover image" #~ msgstr "Обновить обложку" #~ msgid "Cancel selected" #~ msgstr "Отменить выбранное" #~ msgid "Pause selected" #~ msgstr "Пауза" #~ msgid "Resume selected" #~ msgstr "Возобновить" #~ msgid "Cancel download" #~ msgstr "Отмена" #~ msgid "Show in download manager" #~ msgstr "Показывать в текущих загрузках" #~ msgid "Episodes" #~ msgstr "Выпуски" #~ msgid "Set username/password" #~ msgstr "Имя пользователя/пароль" #~ msgid "OPML file on the web" #~ msgstr "OPML файл" #~ msgid "Select podcasts to add" #~ msgstr "Выбрать подкасты" #~ msgid "YouTube user channel" #~ msgstr "Канал пользователя YouTube" #~ msgid "Delete played episodes on startup" #~ msgstr "Удалять прослушанные выпуски при запуске" #~ msgid "Display and view settings" #~ msgstr "Настройки отображения" #~ msgid "Feed updating and downloads" #~ msgstr "Подписка обновляется" #~ msgid "Player applications" #~ msgstr "Вспомогательные приложения" #~ msgid "Player for audio files" #~ msgstr "Проигрыватель аудио" #~ msgid "Player for video files" #~ msgstr "Проигрыватель видео" #, fuzzy #~ msgid "Subscriptions" #~ msgstr "П_одписки" #~ msgid "Synchronize with gpodder.net" #~ msgstr "Синхронизация с gpodder.net" #~ msgid "When new episodes are found" #~ msgstr "Когда найдены новые выпуски" #~ msgid "gpodder.net Synchronization" #~ msgstr "Синхронизация с gpodder.net" #~ msgid "Welcome to gPodder!" #~ msgstr "Добро пожаловать в gPodder!" #~ msgid "Maintainer:" #~ msgstr "Разработка:" #~ msgid "Patches, bug reports and donations by:" #~ msgstr "Патчи, баг-репорты и пожертвования:" #~ msgid "Remove finished downloads from the downloads tab" #~ msgstr "Автоматически очищать вкладку Загрузки" #~ msgid "Website" #~ msgstr "Вебсайт" #~ msgid "No device configured." #~ msgstr "Устройство не настроено." #~ msgid "Synchronizing: %(index)s of %(count)s" #~ msgstr "Синхронизация: %(index)s из %(count)s" #~ msgid "Device synchronized successfully." #~ msgstr "Синхронизация успешна." #~ msgid "Error: Cannot open device!" #~ msgstr "Ошибка: Невозможно открыть устройство!" #~ msgid "Downloads (%d)" #~ msgstr "Загрузки (%d)" #~ msgid "All downloads finished" #~ msgstr "Все загрузки выполнены" #~ msgid "disk usage" #~ msgstr "использование диска" #~ msgid "Updated M3U playlist in download folder." #~ msgstr "Обновлен M3U плейлист в каталоге загрузок" #~ msgid "Updated playlist" #~ msgstr "Обновлен плейлист" #~ msgid "Keep episodes" #~ msgstr "Не удалять выпуски" #~ msgid "iPod" #~ msgstr "iPod" #~ msgid "MP3 player" #~ msgstr "MP3 плеер" #~ msgid "Keep episode" #~ msgstr "Не удалять" #~ msgid "Do you really want to quit gPodder now?" #~ msgstr "Действительно выйти?" #~ msgid "Please check your permissions and free disk space." #~ msgstr "" #~ "Проверьте права на чтение/запись в каталоге загрузок, а также свободное " #~ "место на диске." #~ msgid "Status" #~ msgstr "Статус" #~ msgid "Unable to stream episode" #~ msgstr "Невозможно воспроизвести" #~ msgid "Podcasts (%d)" #~ msgstr "Подкасты (%d)" #~ msgid "No downloadable episodes in feed" #~ msgstr "Нет доступных для загрузки выпусков" #~ msgid "" #~ "Send podcast episodes to Bluetooth devices. Needs the bluetooth-sendto " #~ "command from gnome-bluetooth." #~ msgstr "" #~ "Возможность отправлять выпуски на устройства поддерживающие Bluetooth " #~ "используя gnome-bluetooth" #~ msgid "HTML episode shownotes" #~ msgstr "Детали выпуска в HTML" #~ msgid "Display episode shownotes in HTML format using WebKit." #~ msgstr "" #~ "Возможность просматривать детали выпуска (шоуноты) в виде HTML используя " #~ "WebKit" #~ msgid "iPod synchronization" #~ msgstr "Синхронизация с iPod" #~ msgid "" #~ "Support synchronization of podcasts to Apple iPod devices via libgpod." #~ msgstr "Возможность синхронизации подкастов с Apple iPod используя libgpod." #~ msgid "" #~ "Convert OGG podcasts to MP3 files on synchronization to iPods using " #~ "oggdec and LAME." #~ msgstr "" #~ "Возможность конвертации подкастов формата OGG в MP3 используя oggdecи " #~ "LAME." #~ msgid "iPod video podcasts" #~ msgstr "Видео-подкасты для iPod" #~ msgid "" #~ "Detect video lengths via MPlayer, to synchronize video podcasts to iPods." #~ msgstr "" #~ "Возможность определения длины видеофайла с помощью MPlayer для " #~ "синхронизации с Apple iPod устройствами." #~ msgid "Rockbox cover art support" #~ msgstr "Обложки для Rockbox" #~ msgid "" #~ "Copy podcast cover art to filesystem-based MP3 players running Rockbox." #~ "org firmware. Needs Python Imaging." #~ msgstr "" #~ "Возможность копирования обложек подкастов на устройство с прошивкой " #~ "Rockbox используя Python Imaging Library (PIL)" #~ msgid "Available" #~ msgstr "Доступно" #~ msgid "Missing dependencies" #~ msgstr "Отсутствуют зависимости" #~ msgid "Command \"%s\" not installed" #~ msgstr "\"%s\" - команда не найдена" #~ msgid "Feature" #~ msgstr "Возможность" #~ msgid "Missing components:" #~ msgstr "Отсутствует:" #~ msgid "Use" #~ msgstr "Добавить" #~ msgid "Please wait your media file list is being read from device." #~ msgstr "Производится чтение данных с устройства." #~ msgid "MTP" #~ msgstr "MTP" #~ msgid "Mark it as played" #~ msgstr "Отметить как прослушанный" #~ msgid "%(position)d of %(count)d done" #~ msgstr "%(position)d из %(count)d обновлено" #~ msgid "Processing (%d%%)" #~ msgstr "Обработка (%d%%)" #~ msgid "Please install python-gpod and restart gPodder." #~ msgstr "Установите python-gpod и перезапустите программу." #~ msgid "Cannot sync to MTP device" #~ msgstr "Синхронизация с MTP-устройством невозможна" #~ msgid "Please install libmtp and restart gPodder." #~ msgstr "Установите libmtp и перезапустите программу." #~ msgid "Your device has been synchronized." #~ msgstr "Ваше устройство синхронизировано." #~ msgid "Error closing device" #~ msgstr "Ошибка закрытия устройства" #~ msgid "Please check settings and permission." #~ msgstr "Проверьте настройки и права на чтение/запись." #~ msgid "Copied" #~ msgstr "Скопировано" #~ msgid "Play count" #~ msgstr "Прослушано" #~ msgid "" #~ "Do you really want to remove these episodes from your device? Episodes in " #~ "your library will not be deleted." #~ msgstr "Вы действительно хотите удалить эти выпуски с вашего устройства?" #~ msgid "There has been an error closing your device." #~ msgstr "Ошибка закрытия устройства." #~ msgid "Remove podcasts from device" #~ msgstr "Удалить подкасты с устройства" #~ msgid "Select episodes to remove from your device." #~ msgstr "Выпуски для удаления" #~ msgid "No files on device" #~ msgstr "На устройстве нет файлов" #~ msgid "The devices contains no files to be removed." #~ msgstr "Нет доступных для удаления файлов " #~ msgid "Cannot manage iPod playlist" #~ msgstr "Невозможно настроить плейлист iPod" #~ msgid "Cannot manage MTP device playlist" #~ msgstr "Невозможно настроить плейлист MTP-устройства" #~ msgid "This feature is not available for MTP devices." #~ msgstr "Эта возможность недоступна для MTP-устройств." #~ msgid "gPodder media aggregator" #~ msgstr "gPodder - медиа агрегатор" #~ msgid "Downloading episodes" #~ msgstr "Загрузка выпусков" #~ msgid "Looking for new episodes" #~ msgstr "Поиск новых выпусков" #~ msgid "Cleaning files" #~ msgstr "Удаление лишних файлов" #~ msgid "Download all new episodes" #~ msgstr "Загрузка новых выпусков" #~ msgid "Edit %s" #~ msgstr "Изменить %s" #~ msgid "Edit podcast authentication" #~ msgstr "Настроить аутентификацию для подкаста" #~ msgid "Please enter your username and password." #~ msgstr "Введите ваше имя пользователя и пароль." #~ msgid "Username and password removed." #~ msgstr "Имя пользователя и пароль удалены." #~ msgid "Authentication updated" #~ msgstr "Данные аутентификации обновлены" #~ msgid "Username and password saved." #~ msgstr "Имя пользователя и пароль сохранены." #~ msgid "Load podcast list" #~ msgstr "Загрузить список подкастов" #~ msgid "Loading podcast list, please wait" #~ msgstr "Загрузка списка, подождите" #~ msgid "Please pick another source." #~ msgstr "Выберите другой источник." #~ msgid "Gestures in gPodder" #~ msgstr "Жесты в gPodder" #~ msgid "Swipe left" #~ msgstr "Потянуть налево" #~ msgid "Edit selected podcast" #~ msgstr "Редактировать выбранный подкаст" #~ msgid "Swipe right" #~ msgstr "Потянуть направо" #~ msgid "Update podcast feed" #~ msgstr "Обновить подписку" #~ msgid "Episode list" #~ msgstr "Выпуски" #~ msgid "Display shownotes" #~ msgstr "Показывать коментарии" #~ msgid "Selection is empty." #~ msgstr "Ничего не выбрано." #~ msgid "new episode" #~ msgstr "новый выпуск" #~ msgid "Synchronization" #~ msgstr "Синхронизация" #~ msgid "Skip this podcast when syncing to my device" #~ msgstr "Не синхронизировать подкаст с устройством" #~ msgid "Additional components" #~ msgstr "Возможности" #~ msgid "Install package" #~ msgstr "Установить" #~ msgid "Playlist manager" #~ msgstr "Редактор плейлиста" #~ msgid "Create your playlist by selecting and sorting these episodes." #~ msgstr "Выберите выпуски для создания плейлиста." #~ msgid "Manage playlist on MP3 player" #~ msgstr "Редактировать плейлист устройства" #~ msgid "Select episodes" #~ msgstr "Выбрать выпуски" #~ msgid "Show icon in system tray" #~ msgstr "Значок в области уведомлений" #~ msgid "Synchronizing Podcasts" #~ msgstr "Подкасты синхронизируются" #~ msgid "Copying Files To Device" #~ msgstr "Файлы копируются на устройство" #~ msgid "" #~ "Episodes marked for synchronization are now transferred to your player " #~ "device." #~ msgstr "Выпуски копируются на устройство" #~ msgid "Initializing..." #~ msgstr "Инициализация..." #~ msgid "Close" #~ msgstr "Закрыть окно" #~ msgid "Copy selected episodes to device" #~ msgstr "Отправить на устройство" #~ msgid "Device" #~ msgstr "Устройство" #~ msgid "Manage device playlist" #~ msgstr "Редактировать плейлист" #~ msgid "Select and remove episodes from device" #~ msgstr "Удалить выпуски с устройства" #~ msgid "Sync episodes to device" #~ msgstr "Синхронизировать" #~ msgid "Transfer" #~ msgstr "Передача" #~ msgid "Configuration editor" #~ msgstr "Редактор настроек" #~ msgid "Add new podcasts" #~ msgstr "Добавить подкасты" #~ msgid "Advanced..." #~ msgstr "Расширенные" #~ msgid "" #~ "Nokia Media Player\n" #~ "MPlayer" #~ msgstr "" #~ "Nokia Media Player\n" #~ "MPlayer" #~ msgid "Use gestures (single selection)" #~ msgstr "Использовать жесты " #~ msgid "Copy selected text" #~ msgstr "Скопировать текст" #~ msgid "Limit DLs to" #~ msgstr "Загр. одновременно" #~ msgid "Max." #~ msgstr "Макс." #~ msgid "gpodder.net Settings" #~ msgstr "Настройки gpodder.net" #~ msgid "My gpodder.net account" #~ msgstr "Аккаунт gpodder.net" #~ msgid "Keep" #~ msgstr "Не удалять" #~ msgid "Force using the Maemo 4 user interface" #~ msgstr "Запустить интерфейс для Maemo 4" #~ msgid "Force using the Maemo 5 user interface" #~ msgstr "Запустить интерфейс для Maemo 5" #~ msgid "manual only" #~ msgstr "только вручную" #~ msgid "Don't ask me again" #~ msgstr "Не спрашивать снова" #~ msgid "Ask before closing gPodder" #~ msgstr "Подтверждать закрытие программы" #~ msgid "Updating..." #~ msgstr "Обновление..." #~ msgid "MTP device synchronization" #~ msgstr "Синхронизация MTP-устройств" #~ msgid "" #~ "Support synchronization of podcasts to devices using the Media Transfer " #~ "Protocol via pymtp." #~ msgstr "" #~ "Возможность синхронизации подкастов с устройствами поддерживающими Media " #~ "Transfer Protocol ( MTP ) используя pymtp." #~ msgid "Update Feed" #~ msgstr "Проверить обновления" #~ msgid "Update M3U playlist" #~ msgstr "Обновить M3U плейлист" #~ msgid "Allow deletion of all episodes" #~ msgstr "Позволить удалять выпуски" #~ msgid "Prohibit deletion of all episodes" #~ msgstr "Запретить удаление выпусков" #~ msgid "OPML:" #~ msgstr "OPML:" #~ msgid "Remove multiple podcasts" #~ msgstr "Удалить подкасты" #~ msgid "Play all downloads" #~ msgstr "Прослушать загрузки" #~ msgid "Update feed" #~ msgstr "Проверить обновления" #~ msgid "Do not keep" #~ msgstr "Позволить удаление" #~ msgid "Not logged in" #~ msgstr "Вы не зашли" #~ msgid "Allow removal" #~ msgstr "Позволить удаление" #~ msgid "Device configuration" #~ msgstr "Настройка устройства" #~ msgid "Device ID:" #~ msgstr "ID:" #~ msgid "Device Name:" #~ msgstr "Имя:" #~ msgid "Enable synchronization of subscription list" #~ msgstr "Синхронизировать список подписок" #~ msgid "Select device" #~ msgstr "Выбрать устройство" #~ msgid "Type:" #~ msgstr "Тип:" #~ msgid "Do not download" #~ msgstr "Не загружать" #~ msgid "Save to disk" #~ msgstr "Сохранить как..." #~ msgid "Send via bluetooth" #~ msgstr "Отправить по Bluetooth" #~ msgid "Transfer to %s" #~ msgstr "Отправить на %s" #~ msgid "Prohibit deletion" #~ msgstr "Запретить удаление" #~ msgid "Select a device" #~ msgstr "Выберите устройство" #~ msgid "Device:" #~ msgstr "Устройство:" #~ msgid "Use device" #~ msgstr "Использовать устройство" #~ msgid "Desktop" #~ msgstr "Настольный" #~ msgid "Laptop" #~ msgstr "Ноутбук" #~ msgid "Mobile phone" #~ msgstr "Моб. телефон" #~ msgid "Server" #~ msgstr "Сервер" #~ msgid "Downloading device list" #~ msgstr "Загрузка списка устройств" #~ msgid "Getting the list of devices from your account." #~ msgstr "Получение списка устройств с сервера." #~ msgid "Error getting list" #~ msgstr "Ошибка получения списка" #~ msgid "Go to gpodder.org" #~ msgstr "Открыть gpodder.org" #~ msgid "every %d minutes" #~ msgstr "каждые %d минут" #~ msgid "%s is locked" #~ msgstr "%s защищен от удаления" #~ msgid "" #~ "You cannot delete this locked episode. You must unlock it before you can " #~ "delete it." #~ msgstr "" #~ "Вы не можете удалить этот выпуск. Отключите запрет в настройках выпуска/" #~ "подкаста. " #~ msgid "Remove %s?" #~ msgstr "Удалить %s?" #~ msgid "" #~ "If you remove this episode, it will be deleted from your computer. If you " #~ "want to listen to this episode again, you will have to re-download it." #~ msgstr "" #~ "Файл выпуска будет удален. Чтобы прослушать этот выпуск снова, вам " #~ "придется вновь его загружать." #~ msgid "" #~ "If you remove these episodes, they will be deleted from your computer. If " #~ "you want to listen to any of these episodes again, you will have to re-" #~ "download the episodes in question." #~ msgstr "" #~ "Файлы выпусков будут удалены. Чтобы прослушать любой из этих выпусков " #~ "снова, вам придется вновь его загружать." #~ msgid "Remove %(unlocked)d out of %(selected)d episodes?" #~ msgstr "Удалить %(unlocked)d из %(selected)d выпусков?" #~ msgid "" #~ "The selection contains locked episodes that will not be deleted. If you " #~ "want to listen to the deleted episodes, you will have to re-download them." #~ msgstr "" #~ "Среди выпусков есть запрещенные для удаления. Остальные выпуски будут " #~ "удалены с компьютера. " #~ msgid "Removing episodes" #~ msgstr "Удаление выпусков" #~ msgid "Go to my.gpodder.org" #~ msgstr "Открыть my.gpodder.org" #~ msgid "" #~ "There are unfinished downloads from your last session.\n" #~ "Pick the ones you want to continue downloading." #~ msgstr "" #~ "Загрузки не были завершены.\n" #~ "Самостоятельно выберите нужные для их возобновления." #~ msgid "%d done" #~ msgid_plural "%d done" #~ msgstr[0] "%d завершена" #~ msgstr[1] "%d завершено" #~ msgstr[2] "%d завершено" #~ msgid "There has been an error updating %(url)s: %(message)s" #~ msgstr "Произошла ошибка обновления %(url)s: %(message)s" #~ msgid "Custom command" #~ msgstr "Пользовательская команда" #~ msgid "" #~ "You can specify a custom format string for the file names on your MP3 " #~ "player here." #~ msgstr "Здесь вы можете указать шаблон для имен файлов." #~ msgid "" #~ "The format string will be used to generate a file name on your device. " #~ "The file extension (e.g. \".mp3\") will be added automatically." #~ msgstr "" #~ "Этот шаблон будет использован для формирования имени каждого файла во " #~ "время синхронизации с устройством. Расширение файла (.mp3, .ogg или " #~ "другое ) будет добавлено автоматически." #~ msgid "/path/to/fs-based-player" #~ msgstr "/путь/к/mp3-плееру" #~ msgid "/path/to/ipod" #~ msgstr "/путь/к/ipod" #~ msgid "Advanced window options" #~ msgstr "Поведение окна" #~ msgid "Audio Media Player" #~ msgstr "Аудио плеер" #~ msgid "Automatic download of episode list" #~ msgstr "Автоматическая загрузка списка доступных выпусков" #~ msgid "Device Configuration" #~ msgstr "Устройство" #~ msgid "Download Folder" #~ msgstr "Каталог для загрузок" #~ msgid "Notification Area Integration" #~ msgstr "Информирование пользователя" #~ msgid "Synchronization Options" #~ msgstr "Настройки синхронизации" #~ msgid "Video Media Player" #~ msgstr "Видео плеер" #~ msgid "Automatically download new episodes when gPodder is minimized" #~ msgstr "Загружать новые выпуски когда gPodder свернут" #~ msgid "Check for new episodes every" #~ msgstr "Проверять новые выпуски каждые " #~ msgid "Close to system notification area" #~ msgstr "Сворачивать в область уведомлений при закрытии" #~ msgid "Create a subfolder for each podcast" #~ msgstr "Создавать поддиректорию для каждого подкаста" #~ msgid "Custom filename:" #~ msgstr "Имя файла:" #~ msgid "Delete episodes on device that have been marked played in gPodder" #~ msgstr "Удалять с устройства выпуски, прослушанные в gPodder" #~ msgid "" #~ "If checked, OGG files will not be converted to MP3 before being " #~ "transfered." #~ msgstr "Не конвертировать OGG файлы в MP3 перед сохранением на устройство." #~ msgid "" #~ "If checked, a subfolder will be created for each podcast synchronized. If " #~ "not checked, all episodes will be copied directly to the folder specified " #~ "by \"Sync to folder:\"." #~ msgstr "" #~ "Создавать на устройстве поддиректории для каждого подкаста. Если не " #~ "отмечено, все выпуски будут сохранены в корне указанной выше директории." #~ msgid "" #~ "If checked, gPodder will delete played episodes that are older than the " #~ "specified amount of days (in the Downloads tab) on every startup." #~ msgstr "" #~ "Удалять старые выпуски, согласно настройкам gPodder, при каждом запуске " #~ "программы." #~ msgid "" #~ "If checked, gPodder will update the status of the episode as if it has " #~ "been played locally after copying it to your device" #~ msgstr "Отмечать выпуск как прослушанный при копировании на устройство" #~ msgid "MTP-based player" #~ msgstr "MTP-устройство" #~ msgid "My player supports OGG" #~ msgstr "Мой плеер поддерживает .ogg" #~ msgid "Never automatically download new episodes" #~ msgstr "Не загружать новые выпуски автоматически" #~ msgid "Only show tray icon when minimized" #~ msgstr "Показывать значок только когда gPodder свернут" #~ msgid "Only sync tracks that have not been played" #~ msgstr "Синхронизировать только не прослушанные выпуски" #~ msgid "Start gPodder minimized" #~ msgstr "Запускать свернутым" #~ msgid "Sync to folder:" #~ msgstr "Синхронизировать с:" #~ msgid "Tray Icon" #~ msgstr "Дополнительно" #~ msgid "Type of device:" #~ msgstr "Тип устройства:" #~ msgid "days" #~ msgstr "дней" #~ msgid "gPodder Preferences" #~ msgstr "Настройки" #~ msgid "minutes" #~ msgstr "минут" #~ msgid "Search podcast.de:" #~ msgstr "Поиск на podcast.de:" #~ msgid "Search podcast.de" #~ msgstr "Поиск на podcast.de" #~ msgid "T-Shirts and mugs" #~ msgstr "Сувениры gPodder" #~ msgid "Really delete this podcast and all downloaded episodes?" #~ msgstr "Действительно удалить подкаст и все загруженные выпуски?" #~ msgid "General" #~ msgstr "Основное" #~ msgid "UID:" #~ msgstr "UID:" #~ msgid "gPodder downloads finished" #~ msgstr "Загрузки завершены" #~ msgid "gPodder downloads failed" #~ msgstr "Ошибка загрузки" #~ msgid "Login to my.gpodder.org" #~ msgstr "Вход на my.gpodder.org" #~ msgid "Please enter your e-mail address and your password." #~ msgstr "Введите ваш e-mail адрес и пароль." #~ msgid "E-Mail Address" #~ msgstr "E-Mail" #~ msgid "Result of subscription download" #~ msgstr "Результат загрузки" #~ msgid "Please set up your username and password first." #~ msgstr "Сначала введите ваши логин и пароль." #~ msgid "Username and password needed" #~ msgstr "Необходимы имя пользователя и пароль" #~ msgid "Results of upload" #~ msgstr "Результаты обновления" #~ msgid "Please have a look at the website for more information." #~ msgstr "Посетите вебсайт для подробностей." #~ msgid "Authentication failed." #~ msgstr "Ошибка аутентификации." #~ msgid "Protocol error." #~ msgstr "Ошибка протокола." #~ msgid "Unknown response." #~ msgstr "Неизвестный ответ." #~ msgid "Upload to my.gpodder.org" #~ msgstr "Сохранить на my.gpodder.org" #~ msgid "%d of %d done" #~ msgstr "%d из %d завершено" #~ msgid "Error updating %s" #~ msgstr "Ошибка обновления %s" #~ msgid "Updated %s (%d/%d)" #~ msgstr "Обновление %s (%d/%d)" #~ msgid "kb/s" #~ msgstr "КБ/с" #~ msgid "" #~ "%s\n" #~ "%s" #~ msgstr "" #~ "%s\n" #~ "%s" #~ msgid "Your device has been updated by gPodder." #~ msgstr "Устройство обновлено gPodder'ом" #~ msgid "Operation finished" #~ msgstr "Операция завершена" #~ msgid "None active" #~ msgstr "Нет активных загрузок" #~ msgid "Downloading one new episode." #~ msgstr "Загрузка нового выпуска." #~ msgid "%i new episodes are available for download" #~ msgstr "%i новых выпусков доступно для загрузки" #~ msgid "Updating podcast feeds" #~ msgstr "Обновление подписок" #~ msgid "Do you really want to remove %s and all downloaded episodes?" #~ msgstr "Действительно удалить %s и все загруженные выпуски?" #~ msgid "Do not delete my downloaded episodes" #~ msgstr "Не удалять загруженные выпуски" #~ msgid "Podcast removed: %s" #~ msgstr "Подкаст удален: %s" #~ msgid "One subscription exported" #~ msgstr "Подписка экспортирована" #~ msgid "%d subscriptions" #~ msgstr "%d подписок" #~ msgid "one day ago" #~ msgstr "один день назад" #~ msgid "0 seconds" #~ msgstr "0 секунд" #~ msgid "1 hour" #~ msgstr "1 час" #~ msgid "1 minute" #~ msgstr "1 минута" #~ msgid "1 second" #~ msgstr "1 секунда" #~ msgid "one more episode" #~ msgstr "ещё выпуск" #~ msgid "1 podcast selected" #~ msgstr "Выбран подкаст" #~ msgid "Clean up list" #~ msgstr "Очистить список" #~ msgid "Loading, please wait" #~ msgstr "Загрузка, подождите" #~ msgid "" #~ "gPodder can automatically upload your subscription list to my.gpodder.org " #~ "when you close it. Do you want to enable this feature?" #~ msgstr "" #~ "gPodder может автоматически сохранять ваши подписки на my.gpodder.org при " #~ "выходе из программы. Включить эту возможность?" #~ msgid "Be careful" #~ msgstr "Осторожнее!" #~ msgid "Not supported yet." #~ msgstr "Не поддерживается." #~ msgid "My podcast subscriptions" #~ msgstr "Мои подписки" #~ msgid "Your subscription list is empty. Add some podcasts first." #~ msgstr "Нет подписок. Добавьте их через меню." #~ msgid "There was an error sending your subscription list via e-mail." #~ msgstr "Произошла ошибка при отправке ваших подписок по e-mail." #~ msgid "Send list via e-mail" #~ msgstr "Отправить по e-mail" gpodder-3.5.2/po/sv.po0000644000175000017500000020551212220345607014171 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Daniel Sandman , 2012. # Peter Hultqvist , 2011. # , 2012. # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/gpodder/language/" "sv/)\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder på %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d dag sedan" msgstr[1] "%(count)d dagar sedan" #: src/gpodder/util.py:495 msgid "Today" msgstr "Idag" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Igår" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(okänt)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d sekund" msgstr[1] "%(count)d sekunder" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d timme" msgstr[1] "%(count)d timmar" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d minut" msgstr[1] "%(count)d minuter" #: src/gpodder/util.py:1245 msgid "and" msgstr "och" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Avbruten av användare" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Skriver data till hårddisk" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Öppnar iPod databas" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod öppnad" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Sparar iPod databas" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Skriver utökad gtkpod databas" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Raderar %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Lägger till %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Fel vid kopiering av %(episode)s: Inte tillräckligt med ledigt diskutrymme " "på %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Öppna MP3 spelare" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "MP3 spelare öppnad" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Fel vid öppnande av %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP enhet" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Öppnar MTP enheten" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s öppnad" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Stänger %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s stängd" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Lägger till %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Tillagt" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "Köad" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Synkronisering" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Klar" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Misslyckad" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Avbruten" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Pausad" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Fel: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Lägg till %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Radera %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 #, fuzzy msgid "Invalid request" msgstr "Ogiltig URL" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Inga prenumerationer" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Ingen beskrivning tillgänglig" #: src/gpodder/model.py:679 msgid "unknown" msgstr "okänt" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Annan" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Ljud" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Fel användarnamn/lösenord." #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Laddar ner" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "Innehåll från server saknas" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O Fel: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP Fel: %(code)s: %(message)s" #: src/gpodder/extensions.py:55 #, fuzzy msgid "Desktop Integration" msgstr "Ubuntu Unity-integration" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Heltal" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Pausa nedladdning" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "Saknas beskrivning för den här extensionen" #: src/gpodder/extensions.py:213 #, fuzzy, python-format msgid "Command not found: %(command)s" msgstr "Anvädar kommando finns inte" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Python modul \"%s\" ej installerad" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Kommando: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Förvald applikation" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Laddar inkompletta nedladdningar" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Nedladdningen av några avsnitt avslutades inte under förra sessionen" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d partiell fil" msgstr[1] "%(count)d partiella filer" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Återuppta alla" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Ofullständiga nedladdningar från förra sessionen upptäcktes." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Händelse" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Bekräfta ändringar från gpodder.net" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Välj de händelser du vill ska ske." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Laddar upp prenumerationer" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Dina prenumerationer laddas upp till servern." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Lista uppladdad." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Fel under uppladdning" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Avsnitt" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Storlek" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "varaktighet" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Datum" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "Synliga kolumner" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Förlopp" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Laddar avsnitt" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Inga avsnitt i denna vy" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Inga avsnitt tillgängliga" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Inga poddsändningar i denna vy" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Inga prenumerationer" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Inga aktiva nedladdningar" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktiv" msgstr[1] "%(count)d aktiva" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d misslyckad" msgstr[1] "%(count)d misslyckade" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d kölagd" msgstr[1] "%(count)d kölagda" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "laddar ner %(count)d fil" msgstr[1] "laddar ner %(count)d filer" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Var vänlig rapportera detta problemet och starta om gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Ej hanterat undantag" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Fel vid tolkning av kanal: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Kunde inte lägga till några av poddsändningarna" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Nedladdningar färdiga" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Nedladdningar misslyckades" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Kunde inte lägga till några av poddsändningarna" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Synkronisering klar." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Enheten synkroniserad" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "%(count)d till avsnitt" msgstr[1] "%(count)d fler avsnitt" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Detaljer om avsnittet" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Starta nedladdning nu" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Ladda ner" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "A_vbryt" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Pausa" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Radera från lista" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Uppdatera poddsändningar" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Öppna katalog för nedladdningar" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "Markera avsnitt som spelat" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arkiv" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Radera poddsändning" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Inställningar för Poddsändare" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Fel vid konvertering av fil." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Bluetooth filöverföring" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Förhandsgranska" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Ström" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Skicka till" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Lokal mapp" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth enhet" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Ny" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "Var vänlig kontrollera spelarens konfiguration under inställningar." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Fel vid öppnande av spelare" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Lägger till poddsändning" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Var vänlig vänta medan avsnittets information laddas ned." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Hoppar över existerade prenumerationer" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Du prenumererar redan på dessa poddsändningar:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Poddsändningen kräver inloggning" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Logga in till %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Inloggning misslyckades" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "Upptäckte omdirigering av webbsidan " #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "Webbadressen %(url)s omdirigeras till %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Vill du besöka webbsidan nu ?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Kunde inte lägga till några av poddsändningarna" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Några av poddsändningarna kunde inte läggas till din lista:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Okänd" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Omdirigering upptäcktes" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Sammanfogar aktiviteter för avsnitt" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Avsnittsaktiviteter från gpodder.net är nu sammanfogade." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Avbryter..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Nytt namn:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Uppdaterar %(count)d flöde..." msgstr[1] "Uppdaterar %(count)d flöden..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Fel vid uppdatering av %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Kanalen på %(url)s kunde inte uppdateras." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Fel vid uppdatering av kanal" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Uppdaterad %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Inga nya avsnitt" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Laddar ner %(count)d nytt avsnitt." msgstr[1] "Laddar ner %(count)d nya avsnitt." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Nya avsnitt finns tillgängliga" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d nytt avsnitt tillagt till nerladdningslistan." msgstr[1] "%(count)d nya avsnitt tillagda till nerladdningslistan." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d nytt avsnitt tillgängligt" msgstr[1] "%(count)d nya avsnitt tillgängliga" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Avsluta gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Just nu laddar du ner avsnitt. Du kan återuppta nerladdningen nästa gång du " "startar gPodder. Vill du avsluta nu?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Avsnitten är låsta" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "De valda avsnitten är låsta. Var vänlig lås upp de avsnitt du önskar radera " "innan du försöker radera dem." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Ta bort %(count)d avsnitt?" msgstr[1] "Ta bort %(count)d avsnitt?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Borttagning av avsnitt tar även bort nedladdade filer." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Raderar avsnitt" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Var vänlig vänta medan avsnitten raderas" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Markera äldre än %(count)d dag" msgstr[1] "Markera äldre än %(count)d dagar" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Välj spelade" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Markera avslutade" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Välj de avsnitt du önskar radera:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Radera avsnitt" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Ingen poddsändning vald" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Var vänlig välj en poddsändning i poddsändarlistan för att uppdatera." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Nedladdningsfel vid hämtning av %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Nedladdningsfel" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Välj de avsnitt du önskar ladda ned:" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Markera som gammal" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Var vänlig sök senare efter nya avsnitt." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Inga nya avsnitt tillgängliga" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Logga in till gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Vänligen logga in för att hämta dina prenumerationer." #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Prenumerationer på gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Var vänlig välj en poddsändning i listan att redigera." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Poddsändning" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Radera poddsändning" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Välj de avsnitt du önskar radera." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Radera" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Raderar poddsändning" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Vänligen vänta medan poddsändningen raderas" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" "Vill du verkligen radera denna poddsändning och alla nedladdade avsnitt?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Raderar poddsändning" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Vänligen vänta medan poddsändningarna raderas" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" "Vill du verkligen radera dessa poddsändningar och alla nedladdade avsnitt?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Var vänlig välj en poddsändning att radera i poddsändarlistan" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML filer" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Inportera från OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Importera poddsändningar från en OPML fil" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Inget att exportera" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Din lista på prenumerationer av poddsändningar är tom. Du behöver först " "prenumerera på en poddsändning innan du kan exportera din " "prenumerationslista." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Exportera till OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d prenumeration exporterad" msgstr[1] "%(count)d prenumerationer exporterade" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Din lista på poddsändningar är exporterad." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" "Kunde inte exportera till OMPL-filen. Var vänlig kontrollera dina skriv-" "rättigheter." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "OPML export misslyckades" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Inga avsnitt tillgängliga" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Nya avsnitt finns tillgängliga" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Raderar: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "utgivet: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Hämta mina prenumerationer från gpodder.net" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "Om gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "Donera / Önskelista Amazon" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Rapportera ett problem" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "Tack till följande översättare:" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Översättning gjord av:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Tack till:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "Var vänlig välj en episod från episodlistan för att visa översikten." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Ingen episod är vald" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Kan inte starta gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus fel: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "från %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Heltal" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "Flyttal" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Boolean" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Sträng" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "utgiven %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "spelad" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "ej spelad" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "idag" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "nedladdad %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Raderad" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Nytt avsnitt:" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Nedladdat avsnitt" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Nedladdat videoavsnitt" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Nedladdad bild" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Nedladdad fil" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "saknad fil" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "aldrig visade" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "aldrig spelade" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "aldrig öppnade" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "visade" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "öppnad" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "radering är förhindrad" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Alla avsnitt" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "från alla poddsändningar" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Prenumeration pausad" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Inget att klistra in." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Klippbordet är tomt" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Anvädarnamn" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Ny användare" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Logga in" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Inloggning krävs" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Lösenord" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Välj mål" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Inställning" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Sätt till" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Kan inte sätta värdet för %(field)s. \"%(value)s\" måste vara av typen " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Fel: Inställningsalternativ" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Gör ingenting" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Visa avsnittslistan" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Lägg till nedladdningslista" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Ladda ned omedelbart" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ingen" #: src/gpodder/gtkui/desktop/preferences.py:72 #, fuzzy msgid "Filesystem-based" msgstr "Filsystem-baserad MP3 spelare" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Markera som ej spelad" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Radera från gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Fel: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Egenformaterade strängar" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "Namn" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "varaktighet" #: src/gpodder/gtkui/desktop/preferences.py:357 #, fuzzy msgid "Extension info" msgstr "Modulinfo för extension" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "Modulinfo för extension" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Ställ in musik spelare" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Kommando:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Ställ in video spelare" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "manuellt" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "efter %(count)d dag" msgstr[1] "efter %(count)d dagar" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Ersätt prenumerationslista på servern" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Fjärrpoddsändningar som inte har lagts till lokalt kommer att raderas från " "servern.Fortsätt?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Välj monteringspunkt för iPod" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Välj monteringspunkt för iPod" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Sök:" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Angiven webbadress erbjuder ingen giltig OPML post för poddsändning." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Inga kanaler funna" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Det finns ingen YouTube kanal som stämmer med denna sökning." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Inga kanaler hittades" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Välj alla" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Välj ingen" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Ingenting valt" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d avsnitt" msgstr[1] "%(count)d avsnitt" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "storlek: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Kanalen på %(url)s kunde inte uppdateras." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Fel vid öppnande av spelare" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Händelse" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Nytt namn:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Välj ny omslagsbild för poddsändning" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Du kan endast släppa en fil eller webbadress åt gången här." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Drag an drop (drag och släpp)" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Du kan endast släppa lokala filer och http:// webbadresser här." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Ingen enhet konfigurerad" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Var vänlig konfigurera din enhet i dialogen för Inställningar." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Kan inte öppna enhet" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Var vänlig kontrollera konfigurationen i dialogen för Inställningar." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Inte tillräckligt med ledigt utrymme på enheten" #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Du behöver frigöra %s.\n" "Vill du fortsätta?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Lista uppladdad." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Fel vid konvertering av fil." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Alla" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "Göm borttagna" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Nedladdade" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "Arkiverade" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "Videor" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Markera som ej spelad" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "ospelad nedladdning" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "efter %d dag" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "efter %d dag" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Raderar avsnitt" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Kunde inte radera poddsändare." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Radera" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "Laddar upp prenumerationer..." #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "Fel under nedladdning:" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Uppdatera alla" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Uppdatera" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Byt namn" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "Byt avsnitt" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Avsluta prenumeration" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "Sammanfogar avsnitt händelser..." #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "Sammanfogar avsnitt händelser (%d)" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "Radera poddsändare och avsnitt?" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "Nytt namn:" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "Nytt namn:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "Radera avsnitt" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Markera som ny" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Tillåt radering" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "Lägg till i uppspelningskö" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "Lägger till podsändare..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Kunde inte lägga till några av poddsändningarna" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Återuppta alla" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Okänt spår" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s i Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Spår publicerade av %s i Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%ss favoriter i Soundcloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Spår favoriserade av %s i Soundcloud" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "iPod OGG konverterare" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "Ubuntu programindikator" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "Visa en statusindikator i översta fältet" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "Visa huvudmeny" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Avsluta" #: share/gpodder/extensions/taskbar_progress.py:28 #, fuzzy msgid "Show download progress on the taskbar" msgstr "Visa nedladdningsindikator i Unity:s programstartikon" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "ett avsnitt nerladdat" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "En ny episod är tillgängligt för nedladdning" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "Konverterar fil" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "Konverterar fil" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Hämta omslagsbild från fil" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Radera ny markering" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Sök efter nya avsnitt vid uppstart" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Sök efter nya avsnitt vid uppstart" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Filnamn" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Status ikon" #: share/gpodder/extensions/gtk_statusicon.py:12 #, fuzzy msgid "Show a status icon for Gtk-based Desktops." msgstr "Visa en statusindikator i översta fältet" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "Konverterar fil" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Visa \"Alla avsnitt\" i poddsändningslistan" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "Ubuntu Unity-integration" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "Visa nedladdningsindikator i Unity:s programstartikon" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Lägg till en ny poddsändning" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "Webbadress:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder Redigerare för poddsändningar" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "Avsnitt:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Inaktivera flödesuppdatering (inaktivera prenumeration)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Synkroniserar med iPod/spelare" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Radera strategi:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Allmänt" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP Inloggning" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Användarnamn:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Lösenord:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Platser" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Ladda ned till:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Webbsida:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "Webbsida etikett" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Avancerat" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder Redigerare av konfigurationer" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Sök efter:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Visa Alla " #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Poddsändningar" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Sök efter nya avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Ladda ned nya avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Inställningar" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "Prenumerationer" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Upptäck nya poddsändningar" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Lägg till poddsändning via webbadress" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Importera från OPML fil" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Exportera till OPML fil" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Gå till gpodder.net" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "Avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Spela upp" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Öppna" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "Växla ny status" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Ändra raderingslås " #: share/gpodder/ui/gtk/gpodder.ui.h:26 #, fuzzy msgid "E_xtras" msgstr "Övrigt" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Synkronisera med enhet" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Visa" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "Visa \"Alla avsnitt\" i poddsändningslistan" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "Använd avsnitt för podcast-lista" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Visa verktygsfält" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Beskrivningar för avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Dölj raderade avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Nedladdade avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Ej spelade avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Dölj poddsändningar utan avsnitt" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Hjälp" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Anvädarmanual" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filter:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Poddsändningar" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Begränsa hastigheten till" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Begränsa nedladdningar till" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Välj avsnitt" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Inställningar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "Välkommen till gPodder" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Din lista över prenumerationer är tom." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Välj från en lista med exempel på poddsändningar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Lägg till poddsändning via webbadress" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Hämta mina prenumerationer från gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Ljudspelare:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Videospelare:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "Extensioner" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Ladda alltid ned nya avsnitt automatiskt" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Synkronisera prenumerations och avsnitts aktiviteter" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Ersätt lista på server med lokala prenumerationer" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Enhetsnamn:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Uppdateringsintervall:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Maximalt antal avsnitt per poddsändning" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "När nya avsnitt finns tillgängliga:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Uppdatering" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Radera spelade avsnitt" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "Ta bort spelade avsnitt även oavslutade." #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Radera även ospelade avsnitt" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Rensa" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Enhetstyp:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Monteringspunkt:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Efter synkronisering av avsnitt:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Byt ut lista på server" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Namn på spellista:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Synka endast ospelade avsnitt" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Enheter" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Ändra konfiguration" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Hitta nya poddsändningar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Välj alla" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Välj ingen" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML/Sök" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Topp _poddsändningar" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "Spelar nu" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Lägger till poddsändning" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Inställningar" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Om" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "Tack" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "Credits" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 #, fuzzy msgid "Credentials" msgstr "Credits" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "Enhetsnamn" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "gPodder-inställningar" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "Skärmorientering" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "Automatisk rotation" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Inga poddsändningar i denna vy" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Fortsätt uppspelning" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "Aktivera synkronisering" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Logga in till gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "Byt ut lista på server" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "Inget konto? Registrera ett här" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "Spela uppspelningskö" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Namn på spellista:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Detaljer om avsnittet" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Nedladdade avsnitt" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Spela upp avsnitt" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Översikter" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Välj katalog för nedladdning" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Invertera val" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "Inga podsändningar." #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "Lägg till din första podsändning nu." #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "Inga avsnitt" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "Tryck för att ändra filter" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "Visa avsnitt" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "Sök eller ange adress:" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "Topplistan" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "Min gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Exempel på poddsändningar" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "Drivs av gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Prenumerera" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s minut" msgstr[1] "%(count)s minuter" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s sekund" msgstr[1] "%(count)s sekunder" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "utgivet: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "utgivet: %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "Podsändningsuppdatering begärd av extension" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "Avsnittsnedladdning begärd av extension" #: bin/gpo:305 #, fuzzy, python-format msgid "Invalid url: %s" msgstr "Ogiltig URL" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "Du är inte prenumerant av %s." #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Kan inte prenumerera på %s." #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "Kan inte prenumerera på %s." #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "%s har lagts till." #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "Denna konfigurationsinställning finns inte." #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "Döp om %(old_title)s till %(new_title)s" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "Avsluta prenumeration av %s." #: bin/gpo:473 msgid "Updates disabled" msgstr "Uppdateringar inaktiverad" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d nytt avsnitt" msgstr[1] "%(count)d nya avsnitt" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Sök efter nya avsnitt..." #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "Hoppa över %(podcast)s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "Inaktivera flödesuppdatering för %s." #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "Aktivera flödesuppdatering för %s." #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "Lyssna på ALLA nätverksenheter" #: bin/gpo:622 msgid "No podcasts found." msgstr "Inga podsändningar hittade" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "Ange index att prenumerera, ? till lista" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "Ogiltigt värde." #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "Ogiltig adress:%s." #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "Ändrad adress från %(old_url)s till %(new_url)s." #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "Syntax error: %(error)s" #: bin/gpo:824 #, fuzzy msgid "Ambiguous command. Did you mean.." msgstr "Tvetydigt kommando. Menade du..." #: bin/gpo:828 msgid "The requested function is not available." msgstr "Den efterfrågade funktionen är inte tillgänglig." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Skriv ut debug data på stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Prenumerera på kanal från webbadress" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X programprocessnummer" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder Podcastklient" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcastklient" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "Prenumerera på ljud och video från webben" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "iPod OGG konverterare" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "Konverterar fil" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Var god vänta..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "Starta gPodders QML-gränssnitt" gpodder-3.5.2/po/tr.po0000644000175000017500000015706312220345607014175 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/gpodder/language/" "tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "Bugün" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Dün" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(Bilinmiyor)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d saniye" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d saat" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d dakika" #: src/gpodder/util.py:1245 msgid "and" msgstr "ve" #: src/gpodder/sync.py:195 #, fuzzy msgid "Cancelled by user" msgstr "İptal Edildi" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, fuzzy, python-format msgid "Removing %s" msgstr "%s kaldır" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, fuzzy, python-format msgid "Adding %s" msgstr "Podcastler ekleniyor" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "İptal Edildi" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Durduruldu" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Hata: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "%s Ekle" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "%s kaldır" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "" #: src/gpodder/model.py:679 msgid "unknown" msgstr "bilinmiyor" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Diğer" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "Video" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "Ses" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Seçilmedi" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Komut: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Varsayılan uygulama" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Eylem" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Bölüm" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Boyut" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "Süre" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Ilerleme" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Bölümler yükleniyor " #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Bölüm yok" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d aktif" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d başarısız" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1151 #, fuzzy, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "%(count)d başarısız" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "İndirilenler" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "İndirme bitti" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "İndirme başarısız" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "%(count)d bölüm" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Kimlik doğrulama başarısız " #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Bölüm detayları" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Iptal" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Duraklat" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "" #: src/gpodder/gtkui/main.py:1579 #, fuzzy msgid "Open download folder" msgstr "İndirme başarısız" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "Arşiv" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Podcast kaldır" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Podcast ayarları" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "Önizleme" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Bluetooth cihazı" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Yeni" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Podcastler ekleniyor" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Kimlik doğrulama başarısız " #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Bilinmiyor" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Yeni bölüm" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Yeni bölümler mevcut" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "%(count)d yeni bölümler mevcut" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "gPodder çıkış" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "%(count)d bölümü sil?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Bölümler siliniyor" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Bölüm Sil" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "İndirme hatası" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Gpodder.net giriş" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Podcast" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Podcast kaldır" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Kaldır" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Podcast kaldırılıyor" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Podcastler kaldırılıyor" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "OPML dosyaları" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Bölüm yok" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Yeni bölümler mevcut" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "İndirme hatası" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "gPodder Hakkında" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Sorun bildir" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "Çevirisi:" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "Teşekkürler:" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Bölüm seçilmedi" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "bugün" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Silindi" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Yeni bölüm" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Tüm bölümler" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Kullanıcı Adı" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Yeni kullanıcı" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Giriş" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Parola" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Ayar" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Hata: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "Süre" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Komut:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "%(count)d gün sonra" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Arama" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Hepsini seç" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d bölüm" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "boyutu: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Eylem" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Yeni bölüm" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Silindi" #: src/gpodder/qmlui/__init__.py:67 #, fuzzy msgid "Downloaded" msgstr "İndirilenler" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Arşiv" #: src/gpodder/qmlui/__init__.py:71 #, fuzzy msgid "Videos" msgstr "Video" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "Seçilmedi" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "%(count)d gün sonra" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "%(count)d gün sonra" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Bölümler siliniyor" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Sil" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "Tümünü güncelle" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "Güncelle" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Yeniden adlandır" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Ses çalar:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "İndirilenler" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Bilinmeyen parça" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Çıkış" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "İndirme başarısız" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "İndirme başarısız" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Podcast kaldır" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Yeni bölüm" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "İndirme başarısız" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Yeni bir bölüm ekle" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "gPodder Podcast Editor" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Genel" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Kullanıcı Adı:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Parola:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Web Sitesi:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "web sitesi etiketi" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "gPodder Yapılandırma Editorü" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Arama:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Tümünü Göster" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "_Podcastlar" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "Tercihler" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "gpodder.net'e git" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Bölümler" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Oynat" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Aç" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Bluetooth cihazı" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "Araç Çubuğu" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Yardım" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Kullanım kılavuzu" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Filtre:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Podcastlar" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "KiB/s" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Bölüm seçin" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Ayar" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "gPoddera hoşgeldiniz" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Ses çalar:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Video oynatıcı:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Cihaz adı:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Güncelleniyor" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 #, fuzzy msgid "Device type:" msgstr "Cihaz adı:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 #, fuzzy msgid "Devices" msgstr "Cihaz adı:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Yeni bölüm bul" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Tümünü Seçin" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Seçilmedi" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "_OPML / Arama" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Podcastler ekleniyor" #: share/gpodder/ui/qml/main_default.qml:41 #, fuzzy msgid "Settings" msgstr "Ayar" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 #, fuzzy msgid "Thanks" msgstr "Teşekkürler:" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Cihaz adı:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Gpodder.net giriş" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Bölüm detayları" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "İndirilenler" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Tüm bölümler" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Seçilmedi" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Podcast kaldır" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Yeni bölüm" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Yeni bölüm" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "Örnekler" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Tümünü güncelle" #: bin/gpo:488 #, fuzzy, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d bölüm" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Yeni bölüm" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Podcastler ekleniyor" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Podcast kaldır" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder Podcast İstemci" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "Podcast İstemci" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "İndirme başarısız" #~ msgid "OK" #~ msgstr "Tamam" #~ msgid "Please wait..." #~ msgstr "Lütfen bekleyin ..." gpodder-3.5.2/po/tr_TR.po0000644000175000017500000015114412220345610014566 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:30+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/gpodder/" "language/tr_TR/)\n" "Language: tr_TR\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" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "" #: src/gpodder/util.py:495 msgid "Today" msgstr "" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "" #: src/gpodder/util.py:1245 msgid "and" msgstr "" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 msgid "No description" msgstr "" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "" #: src/gpodder/model.py:679 msgid "unknown" msgstr "" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 msgid "Interface" msgstr "" #: src/gpodder/extensions.py:57 msgid "Post download" msgstr "" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 msgid "Could not download some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "" #: src/gpodder/gtkui/main.py:1392 msgid "Could not sync some episodes:" msgstr "" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 msgid "No network connection" msgstr "" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 msgid "No updates available" msgstr "" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 msgid "New version available" msgstr "" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, python-format msgid "Release date: %s" msgstr "" #: src/gpodder/gtkui/main.py:3166 msgid "Download the latest version from gpodder.org?" msgstr "" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 msgid "Mark as played" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 msgid "Error" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 msgid "Error writing playlist" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "Add section" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:98 msgid "New section:" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 msgid "Update successful" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 msgid "Error writing playlist files" msgstr "" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 msgid "Hide deleted" msgstr "" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "" #: src/gpodder/qmlui/__init__.py:70 msgid "Archived" msgstr "" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 msgid "Partially played" msgstr "" #: src/gpodder/qmlui/__init__.py:73 msgid "Unplayed downloads" msgstr "" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 msgid "Flattring episode..." msgstr "" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 msgid "Error on upload:" msgstr "" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "" #: src/gpodder/qmlui/__init__.py:811 msgid "Could not add some podcasts:" msgstr "" #: src/gpodder/qmlui/__init__.py:1138 msgid "Resume" msgstr "" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 msgid "Rename episodes after download" msgstr "" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 msgid "Convert video files" msgstr "" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 msgid "Conversion failed" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 msgid "Remove cover art" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 msgid "Search for new episodes on startup" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 msgid "Convert audio files" msgstr "" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 msgid "Sync to device" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 msgid "Getting started" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 msgid "Your podcast list is empty." msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 msgid "Restore my subscriptions from gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 msgid "Playlists Folder:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 msgid "Add podcast" msgstr "" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 msgid "gPodder.net Login" msgstr "" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 msgid "Device name" msgstr "" #: share/gpodder/ui/qml/main_default.qml:303 msgid "gPodder settings" msgstr "" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 msgid "Show podcasts in Music app" msgstr "" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 msgid "Sign in to gPodder.net" msgstr "" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 msgid "Playlist empty" msgstr "" #: share/gpodder/ui/qml/Main.qml:169 msgid "Episode added to playlist" msgstr "" #: share/gpodder/ui/qml/Main.qml:340 msgid "Download episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:346 msgid "Playback episodes" msgstr "" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "" #: share/gpodder/ui/qml/Main.qml:553 msgid "Select downloaded" msgstr "" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "No podcasts." msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "No episodes" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 msgid "Show episodes" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "My gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 msgid "Pull down to refresh" msgstr "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 msgid "Release to refresh" msgstr "" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, python-format msgid "Already subscribed to %s." msgstr "" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, python-format msgid "Unsubscribed from %s." msgstr "" #: bin/gpo:473 msgid "Updates disabled" msgstr "" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "" #: bin/gpo:494 msgid "Checking for new episodes" msgstr "" #: bin/gpo:503 #, python-format msgid "Skipping %(podcast)s" msgstr "" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 msgid "No podcasts found." msgstr "" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 msgid "print logging output on the console" msgstr "" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 msgid "subscribe to the feed at URL" msgstr "" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" gpodder-3.5.2/po/uk.po0000644000175000017500000022621212220345610014152 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Thomas Perl , 2006. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: LANGUAGE \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder на %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d день тому" msgstr[1] "%(count)d дні тому" msgstr[2] "%(count)d днів тому" #: src/gpodder/util.py:495 msgid "Today" msgstr "Сьогодні" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "Вчора" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(невідомо)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d секунда" msgstr[1] "%(count)d секунди" msgstr[2] "%(count)d секунд" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d година" msgstr[1] "%(count)d години" msgstr[2] "%(count)d годин" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d хвилина" msgstr[1] "%(count)d хвилини" msgstr[2] "%(count)d хвилин\t" #: src/gpodder/util.py:1245 msgid "and" msgstr "та" #: src/gpodder/sync.py:195 msgid "Cancelled by user" msgstr "Відхилено користувачем" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "Збереження даних на диск" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "Відкриваю базу даних iPod" #: src/gpodder/sync.py:297 msgid "iPod opened" msgstr "iPod відкритий" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "Збереження даних iPod" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "Зберігання розширеної gtkpod бази даних" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, python-format msgid "Removing %s" msgstr "Видалення %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, python-format msgid "Adding %s" msgstr "Додаю %s" #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" "Помилка копіювання %(episode)s: Недостатньо вільного місця на %(mountpoint)s" #: src/gpodder/sync.py:507 msgid "Opening MP3 player" msgstr "Відкриваю MP3-плеєр" #: src/gpodder/sync.py:510 msgid "MP3 player opened" msgstr "МР3-плеєр відкрито" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "Помилка відкривання %(filename)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "MTP-пристрій" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "Відкриваю МТР-пристрій" #: src/gpodder/sync.py:772 #, python-format msgid "%s opened" msgstr "%s відкрито" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "Закриваю %s" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "%s закрито" #: src/gpodder/sync.py:790 bin/gpo:658 #, python-format msgid "Adding %s..." msgstr "Додаю %s..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "Додано" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "В черзі" #: src/gpodder/sync.py:892 #, fuzzy msgid "Synchronizing" msgstr "Синхронізація" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "Завершено" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "Помилка" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "Скасовано" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "Призупинено" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "Помилка: %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "Додати %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "Видалити %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "Немає підписок" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "Опис відсутній" #: src/gpodder/model.py:679 msgid "unknown" msgstr "невідомий" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "Інше" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "Неправильне ім'я користувача/пароль" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "Завантажую" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "На сервері немає контенту" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "Помилка вводу/виводу: %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP помилка %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "Ціле" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "Призупинити завантаження" #: src/gpodder/extensions.py:100 #, fuzzy msgid "No description for this extension." msgstr "Опис відсутній" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, fuzzy, python-format msgid "Python module not found: %(module)s" msgstr "Модуль Python \"%s\" не встановлено" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "Команда: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "Програма за замовчуванням" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "Завантажую незавершені епізоди" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "Деякі епізоди недозавантажились минулого разу" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d частковий файл" msgstr[1] "%(count)d часткових файли" msgstr[2] "%(count)d часткових файлів" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "Відновити всі завантаження" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "Знайдені незавершені від минулого запуску заванатаження." #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "Дія" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "Затверді зміни з my.gpodder.org" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "Оберіть дію, яку ви хочете виконати." #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "Завантажую підписки" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "Ваш список підписок завантажено на сервер." #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "Список успішно завантежено." #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "Помилка завантаження" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "Епізод" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "Розмір" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "Опубліковано" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "Процес" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "Завантажую епізоди" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "Немає відповідних подкастів" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "Немає доступних епізодів" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "Немає відповідних подкастів" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "Немає підписок" #: src/gpodder/gtkui/main.py:1006 #, fuzzy msgid "No active tasks" msgstr "Немає активних завантажень" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "%(count)d активне" msgstr[1] "%(count)d активні" msgstr[2] "%(count)d активних" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "%(count)d не завантажено" msgstr[1] "%(count)d не завантажено" msgstr[2] "%(count)d не завантажено" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "%(count)d в черзі" msgstr[1] "%(count)d в черзі" msgstr[2] "%(count)d в черзі" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "завантажую %(count)d файл" msgstr[1] "завантажую %(count)d файли" msgstr[2] "завантажую %(count)d файлів" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "Будь ласка, повідомте про цю проблему та перезапустіть gPodder:" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "Необроблене виключення:" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "Помилка парсеру потоків: %s" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "Не зміг додати деякі подкасти" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "Всі завантаження завершено" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "Збій завантаження" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "Не зміг додати деякі подкасти" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 #, fuzzy msgid "Device synchronization finished" msgstr "Синхронізацію завершено." #: src/gpodder/gtkui/main.py:1400 #, fuzzy msgid "Device synchronization failed" msgstr "Пристрій синхронізовано" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "ще %(count)d епізод" msgstr[1] "ще %(count)d епізоди" msgstr[2] "ще %(count)d епізодів" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "Деталі епізоду" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "Почати завантаження" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "Завантажити" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "Скасувати" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "Пауза" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "Видалити зі списку" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "Оновити подкаст" #: src/gpodder/gtkui/main.py:1579 msgid "Open download folder" msgstr "Відкрити теку завантажень" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 #, fuzzy msgid "Mark episodes as old" msgstr "Позначити епізод як прослуханий" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "Видалити подкаст" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "Налаштування подкасту" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "Помилка при конвертуванні файла." #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "Пересилання файлу через Bluetooth" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "Потік" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "Відправити на" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "Локальна тека" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "Пристрій Bluetooth" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "Новий" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "" "Будь ласка, перевірте налаштування вибору медіаплеєра у діалозі Параметри." #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "Помилка при відкритті плеєра" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "Додаю подкасти" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "Будь ласка, почекайте поки інформація про епізоди завантажиться." #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "Існуючи підписки пропущено" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "Ви вже підписані на ці подкасти:" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "Подкаст вимагає аутентифікації" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "Будь ласка, увійдіть до %s:" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "Збій аутентифікації" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "На веб-сайті знайдено перепосилання" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "URL %(url)s пересилає до %(target)s." #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "Хочете перейти на сайт?" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "Не зміг додати деякі подкасти" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "Деякі подкасти не можуть бути додані до вашого списку:" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "Невідомо" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "Знайдено перепосилання" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "Злиття дій над епізодами" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "Дії над епізодами злиті з даними з gpodder.net." #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "Скасовую..." #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "Нова назва:" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "Оновлюю %(count)d потік..." msgstr[1] "Оновлюю %(count)d потоки..." msgstr[2] "Оновлюю %(count)d потоків\t..." #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "Помилка оновлення %(url)s: %(message)s" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "Не вдалося оновити потік %(url)s." #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "Помилка оновлення потоку" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "Оновлено %(podcast)s (%(position)d/%(total)d)" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "Немає нових епізодів" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "Завантажую %(count)d новий епізод." msgstr[1] "Завантажую %(count)d нових епізоди." msgstr[2] "Завантажую %(count)d нових епізодів." #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "Доступні нові епізоди" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "%(count)d новий епізод доданий до списку завантаження." msgstr[1] "%(count)d нових епізоди додані до списку завантаження." msgstr[2] "%(count)d нових епізодів додано до списку завантаження." #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "Наявний %(count)d новий епізод" msgstr[1] "Наявні %(count)d нові епізоди" msgstr[2] "Наявні %(count)d нових епізодів" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "Вийти з gPodder" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" "Ви завантажуєте епізоди. Ви можете відновити завантаження наступного разу, " "коли запустите gPodder. Хочете вийти зараз?" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "Епізоди заблоковані" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" "Обрані епізоди заблоковані. Будь ласка, спочатку розблокуйте епізоди, щоб " "отримати можливість видалити їх." #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "Видалити %(count)d епізод?" msgstr[1] "Видалити %(count)d епізоди?" msgstr[2] "Видалити %(count)d епізодів?" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "Видалення епізодів означає видалення завантажених файлів." #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "Видаляються епізоди" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "Будь ласка, почекайте поки видаляються епізоди." #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "Обрати старші за %(count)d день" msgstr[1] "Обрати старші за %(count)d дні" msgstr[2] "Обрати старші за %(count)d днів\t" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "Вибрати прослухані" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "Обрання завершено" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "Оберіть епізоди, які ви хочете видалити:" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "Видалити епізоди" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "Жодних подкастів не обрано" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "Будь ласка, оберіть оновлюваний подкаст в списку подкастів." #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "Помилка завантаження %(episode)s: %(message)s" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "Помилка завантаження" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "Оберіть епізоди, які ви хочете завантажити." #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "Позначити старим" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "Перевіряти на нові епізоди пізніше." #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "Немає доступних нових епізодів" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "Увійти до gpodder.org" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "Будь ласка, увійдіть в обліковий запис для завантаження підписок" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "Підписки на gpodder.net" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "Будь ласка, оберіть подкаст в списку подкастів для редагування." #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "Подкаст" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "Видалити подкасти" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "Оберіть подкаст, який ви хочете видалити." #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "Видалити" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "Видаляю подкаст" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "Будь ласка, почекайте поки подкаст видаляється." #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "Ви дійсно бажаєте видалити подкаст і всі його епізоди?" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "Видаляю подкасти" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "Будь ласка, почекайте поки подкасти видаляються." #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "Ви дійсно бажаєте видалити обрані подкасти та всі їхні епізоди?" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "Будь ласка, оберіть подкаст, який треба видалити, в списку подкастів." #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "Файли OPML" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "Імпортувати з OPML" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "Імпортувати подкасти з OPML-файлу" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "Немає чого експортувати" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" "Ваш список підписок на подкасти пустий. Будь ласка, підпишіться на якісь " "подкасти перед тим, як намагатися експортувати список підписок." #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "Експортувати в OPML" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "%(count)d підписку експортовано" msgstr[1] "%(count)d підписки експортовано" msgstr[2] "%(count)d підписок експортовано" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "Ваш список підписок успішно експортований." #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "Не вийшло експортувати OPML файл. Будь ласка, перевірте ваші права." #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "Помилка експорту OPML" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "Немає доступних епізодів" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "Доступний новий епізод" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, fuzzy, python-format msgid "Newest version: %s" msgstr "Видаляю: %s" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "опубліковано: %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "Завантажити підписки з my.gpodder.org" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 #, fuzzy msgid "About gPodder" msgstr "Вийти з gPodder" #: src/gpodder/gtkui/main.py:3206 #, fuzzy msgid "Donate / Wishlist" msgstr "Список побажань на Amazon" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "Звітувати про проблему" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "про-перекладача" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" "Будь ласка, оберіть епізод, шоуноти якого хочете побачити, в списку епізодів." #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "Жодних епізодів не обрано" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "Не можу запустити gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "Помилка D-Bus: %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "від %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "Ціле" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "З плаваючою комою" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "Логічне" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "Рядок" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "опубліковано %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "прослухано" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "непрослухано" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "сьогодні" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "завантажено %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "Видалені" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "Новий епізод" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "Епізод завантажено" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "Відео-епізод завантажено" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "Зображення завантажено" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "Файл завантажено" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "відсутній файл" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "не переглянуто" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "не відтворювалось" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "не відкривалося" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "переглянуто" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "відкривалося" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "видалення заборонено" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "Всі епізоди" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "з усіх подкастів" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "Підписку призупинено" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "Немає чого вставляти." #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "Буфер обміну пустий" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "Ім'я користувача:" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "Новий користувач" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "Логін" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "Необхідна аутентифікація" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "Пароль" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "Оберіть теку призначення" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "Параметри" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "Встановити у" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" "Не вдається встановити %(field)s у %(value)s. Необхідний тип даних: " "%(datatype)s" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "Помилка зміни налаштувань" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "Нічого не робити" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "Показати список епізодів" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "Додати до списку завантаження" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "Завантажити негайно" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "Ніщо" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "З файловою системою" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "Позначити як непрослуханий" #: src/gpodder/gtkui/desktop/preferences.py:93 #, fuzzy msgid "Delete from gPodder" msgstr "Видалити з gPodder" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "Помилка: %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, fuzzy, python-format msgid "Custom (%(format_ids)s)" msgstr "Довільний рядок формату" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 msgid "Documentation" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "Налаштування аудіо-програвача" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "Команда:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "Налаштування аудіо-програвача" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "вручну" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "через %(count)d день" msgstr[1] "через %(count)d дні" msgstr[2] "через %(count)d днів" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "Замінити список завантаження на сервері" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" "Віддалений подкаст, що не був доданий локально, буде видалений із сервера. " "Продовжити?" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "Оберіть теку для точки монтування" #: src/gpodder/gtkui/desktop/preferences.py:637 #, fuzzy msgid "Select folder for playlists" msgstr "Оберіть теку для точки монтування" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "Шукати" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "Вказане посилання не надає жодних правильних OPML на подкасти." #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "Не знайдено жодних потоків" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "Немає каналів на YouTube, які відповідали б такому запиту." #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "Не знайдено каналів" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "Вибрати все" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "Нічого не обирати" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "Нічого не обрано" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "%(count)d епізод" msgstr[1] "%(count)d епізоди" msgstr[2] "%(count)d епізодів\t" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "розмір: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy, python-format msgid "Folder %s could not be created." msgstr "Не вдалося оновити потік %(url)s." #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "Помилка при відкритті плеєра" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "Дія" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "Нова назва:" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "Оберіть обкладинку для нового подкасту" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "Ви можете кинути сюди лише один файл чи одне посилання." #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "Перетягніть та киньте" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "Ви можете кидати сюди файли з вашого комп'ютера та http:// посилання." #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "Пристрій не налаштовано" #: src/gpodder/gtkui/desktop/sync.py:87 msgid "Please set up your device in the preferences dialog." msgstr "Будь ласка, налаштуйте ваш пристрій у діалозі Параметри." #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "Не можу відкрити пристрій" #: src/gpodder/gtkui/desktop/sync.py:92 msgid "Please check the settings in the preferences dialog." msgstr "Будь ласка, перевірте налаштування у діалозі Параметри." #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "Недостатньо місця на диску." #: src/gpodder/gtkui/desktop/sync.py:140 #, fuzzy, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" "Вам необхідно звільнити %s.\n" "Бажаєте продовжити?" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "Список успішно завантежено." #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "Помилка при конвертуванні файла." #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "Все" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "Приховати видалені епізоди" #: src/gpodder/qmlui/__init__.py:67 msgid "Downloaded" msgstr "Завантажено" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "Всі епізоди" #: src/gpodder/qmlui/__init__.py:71 msgid "Videos" msgstr "" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "Позначити як непрослуханий" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "невідтворені завантаження" #: src/gpodder/qmlui/__init__.py:244 #, fuzzy, python-format msgid "Flattred (%(count)d)" msgstr "через %(count)d день" #: src/gpodder/qmlui/__init__.py:248 #, fuzzy, python-format msgid "Flattr this (%(count)d)" msgstr "через %(count)d день" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "Видаляються епізоди" #: src/gpodder/qmlui/__init__.py:289 #, fuzzy msgid "Could not log in to Flattr." msgstr "Не можу видалити подкаст." #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "Видалити" #: src/gpodder/qmlui/__init__.py:421 #, fuzzy msgid "Uploading subscriptions..." msgstr "Завантажую підписки" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "Помилка завантаження" #: src/gpodder/qmlui/__init__.py:489 #, fuzzy msgid "Update all" msgstr "Оновити все" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 #, fuzzy msgid "Update" msgstr "Оновити все" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "Переіменувати" #: src/gpodder/qmlui/__init__.py:494 #, fuzzy msgid "Change section" msgstr "Інвертувати виділення" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "Відписатися" #: src/gpodder/qmlui/__init__.py:546 #, fuzzy msgid "Merging episode actions..." msgstr "Злиття дій над епізодами" #: src/gpodder/qmlui/__init__.py:550 #, fuzzy, python-format msgid "Merging episode actions (%d)" msgstr "Злиття дій над епізодами" #: src/gpodder/qmlui/__init__.py:616 #, fuzzy msgid "Remove this podcast and episodes?" msgstr "Прибрати подкаст та його епізоди?" #: src/gpodder/qmlui/__init__.py:638 #, fuzzy msgid "New section name:" msgstr "Нова назва:" #: src/gpodder/qmlui/__init__.py:647 #, fuzzy msgid "New name:" msgstr "Нова назва: %s" #: src/gpodder/qmlui/__init__.py:735 #, fuzzy msgid "Delete this episode?" msgstr "Видалити епізоди" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "Помітити новим" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "Дозволити видалення" #: src/gpodder/qmlui/__init__.py:762 #, fuzzy msgid "Add to play queue" msgstr "Аудіо-програвач:" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 #, fuzzy msgid "Adding podcasts..." msgstr "Додаю подкасти" #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "Не зміг додати деякі подкасти" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "Відновити всі завантаження" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "Невідомий трек" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "%s на Soundcloud" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "Треки, опубліковані %s на Soundcloud." #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "%s в обраних на SoundCloud" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "Треки, занесені в обране %s на Soundcloud." #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 #, fuzzy msgid "File converted" msgstr "Конвертор iPod OGG" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "Вийти" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "Немає епізодів для завантаження" #: share/gpodder/extensions/rename_download.py:17 #, fuzzy msgid "Rename episodes to \".\" on download" msgstr "Доступний для завантаження один новий епізод" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "один файл" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "один файл" #: share/gpodder/extensions/rm_ogg_cover.py:37 #, fuzzy msgid "Remove cover art from OGG files" msgstr "Встановити обкладинку з файлу" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "Прибрати позначку \"нове\"" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "Перевіряти на нові епізоди при старті" #: share/gpodder/extensions/update_feeds_on_startup.py:15 #, fuzzy msgid "Starts the search for new episodes on startup" msgstr "Перевіряти на нові епізоди при старті" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 #, fuzzy msgid "File normalized" msgstr "Ім'я файлу" #: share/gpodder/extensions/gtk_statusicon.py:11 #, fuzzy msgid "Gtk Status Icon" msgstr "Стан" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "один файл" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 #, fuzzy msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "Показувати \"Всі епіозди\" у списку подкастів" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "Додати новий подкаст" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "URL:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "Редактор подкастів gPodder" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 #, fuzzy msgid "Section:" msgstr "Дія" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "Заборонити оновлення потоків (призупинити підписку)" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 #, fuzzy msgid "Synchronize to MP3 player devices" msgstr "Синхронізую з плеєром" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 #, fuzzy msgid "Strategy:" msgstr "Стратегія видалення:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "Головне" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "HTTP/FTP Аутентифікація" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "Ім'я користувача:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "Пароль:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "Місцезнаходження" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "Завантажувати до:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "Сайт:" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "мітка веб-сайту" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "Детальніше" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "Редактор налаштувань gPodder" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "Шукати:" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "Показати Все" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "Подкасти" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "Перевірити наявність нових епізодів" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "Завантажити нові епізоди" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "_Налаштування" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "_Підписки" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "Знайти нові подкасти" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "Додати подкаст за посиланням" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "Імпортувати з OPML-файлу" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "Експортувати до OPML-файлу" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "Перейти на gpodder.org" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "_Епізоди" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "Слухати" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "Відкрити" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "Змінити блокування для видалення" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "Синхронізую з пристроєм" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "_Вигляд" #: share/gpodder/ui/gtk/gpodder.ui.h:29 #, fuzzy msgid "\"All episodes\" in podcast list" msgstr "Показувати \"Всі епіозди\" у списку подкастів" #: share/gpodder/ui/gtk/gpodder.ui.h:30 #, fuzzy msgid "Use sections for podcast list" msgstr "Помилка зберігання списку подкастів" #: share/gpodder/ui/gtk/gpodder.ui.h:31 #, fuzzy msgid "Toolbar" msgstr "Показати панель інструментів" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "Опис епізоду" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "Приховати видалені епізоди" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "Завантажені епізоди" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "Непрослухані епізоди" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "Ховати подкасти без епізодів" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "_Довідка" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "Довідка користувача" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "Фільтр:" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "Подкасти" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "Обмежити швидкість завантаження до:" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "КіБ/с" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "Обмежити кількість одночасних завантажень до:" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "Обрати епізоди" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "Параметри" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 #, fuzzy msgid "Welcome to gPodder" msgstr "gPodder вітає Вас!" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "Ваш список підписок пустий." #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "Обрати подкаст зі списку подкастів-прикладів" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 #, fuzzy msgid "Add a podcast by entering its URL" msgstr "Додати подкаст за посиланням" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "Завантажити підписки з my.gpodder.org" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "Аудіо-програвач:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "Відео-програвач:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 #, fuzzy msgid "Automatically flattr episodes on playback" msgstr "Завжди автоматично завантажувати нові епізоди" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "Синхронізовувати підписки та стан епізодів" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "Замінити список на сервері локальними підписками" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "Назва пристрою:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "Інтервал оновлення:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "Максимальна кількість епізодів на подкаст:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "Коли знайдені нові епізоди:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "Оновлюю..." #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "Видалити старі епізоди:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 #, fuzzy msgid "Remove played episodes even if unfinished" msgstr "Видаляти прослухані епізоди з пристрою" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "Також видалити невідтворені епізоди" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "Очистити" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 msgid "Device type:" msgstr "Тип пристрою:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "Точка монтування:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "Після синхронізації епізоду:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 #, fuzzy msgid "Create playlists on device" msgstr "Замінити список завантаження на сервері" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "Назва списку епізодів:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "Синхронізувати лише непрослухані епізоди" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 msgid "Devices" msgstr "Пристрої" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "Редагувати налаштування" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "Знайти нові подкасти" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "Обрати все" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "Нічого не обирати" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "OPML/Пошук" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "Найпопулярніші _подкасти" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "_YouTube" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "Додаю подкасти" #: share/gpodder/ui/qml/main_default.qml:41 msgid "Settings" msgstr "Параметри" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "Про програму" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gpodder.net" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "Назва пристрою:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "Налаштування my.gPodder.org" #: share/gpodder/ui/qml/main_default.qml:308 #, fuzzy msgid "Screen orientation" msgstr "Орієнтація екрану" #: share/gpodder/ui/qml/main_default.qml:312 #, fuzzy msgid "Automatic rotation" msgstr "Автоматичне очищення" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "Немає відповідних подкастів" #: share/gpodder/ui/qml/main_default.qml:354 #, fuzzy msgid "Auto-Flattr on playback" msgstr "Продовжити відтворення" #: share/gpodder/ui/qml/main_default.qml:364 #, fuzzy msgid "Enable synchronization" msgstr "Після синхронізації:" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "Увійти до gpodder.org" #: share/gpodder/ui/qml/main_default.qml:393 #, fuzzy msgid "Replace list on server" msgstr "Замінити список завантаження на сервері" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 #, fuzzy msgid "Play queue" msgstr "Прослухано" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "Назва списку епізодів:" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "Деталі епізоду" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "Завантажені епізоди" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "Прослухати епізод" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "Шоуноти" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "Оберіть папку для збереження завантажень" #: share/gpodder/ui/qml/Main.qml:573 #, fuzzy msgid "Invert selection" msgstr "Інвертувати виділення" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "Немає подкастів" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "Немає нових епізодів" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "Показати список епізодів" #: share/gpodder/ui/qml/Subscribe.qml:53 #, fuzzy msgid "Search term or URL" msgstr "Шукати:" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "Examples" msgstr "Приклади подкастів" #: share/gpodder/ui/qml/Subscribe.qml:144 #, fuzzy msgid "powered by gpodder.net" msgstr "Перейти на gpodder.org" #: share/gpodder/ui/qml/Subscribe.qml:153 msgid "Subscribe" msgstr "Підписатися" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "опубліковано: %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "опубліковано: %s" #: bin/gpo:248 #, fuzzy msgid "Podcast update requested by extensions." msgstr "Подкаст вимагає аутентифікації" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, fuzzy, python-format msgid "You are not subscribed to %s." msgstr "Ви вже підписані на ці подкасти:" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "Не можу синхронізуватись з iPod" #: bin/gpo:331 #, fuzzy, python-format msgid "Cannot subscribe to %s." msgstr "Не можу синхронізуватись з iPod" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "Відписатися" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "Оновити обрані" #: bin/gpo:488 #, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d новий епізод" msgstr[1] "%(count)d нових епізоди" msgstr[2] "%(count)d нових епізодів" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "Перевіряю на наявність нових епізодів..." #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "Пропускаю подкаст: %s" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, fuzzy, python-format msgid "Enabling feed update from %s." msgstr "Читаю файли з %s" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "Не знайдено жодних потоків" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 #, fuzzy msgid "The requested function is not available." msgstr "Ця функція недоступна для iPod'ів." #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "Виводити налагодження через stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "Підписатись на канал через посилання" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "" #: share/applications/gpodder.desktop.in.h:2 #, fuzzy msgid "gPodder Podcast Client" msgstr "Редактор подкастів gPodder" #: share/applications/gpodder.desktop.in.h:3 #, fuzzy msgid "Podcast Client" msgstr "Список подкастів" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "" #, fuzzy #~ msgid "File converted from ogg to mp3" #~ msgstr "Конвертор iPod OGG" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "один файл" #~ msgid "OK" #~ msgstr "OK" #~ msgid "Please wait..." #~ msgstr "Зачекайте..." gpodder-3.5.2/po/zh_CN.po0000644000175000017500000016140012220345610014531 0ustar thpthp00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2012. # luojie , 2011. msgid "" msgstr "" "Project-Id-Version: gPodder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-24 19:27+0200\n" "PO-Revision-Date: 2013-01-19 12:31+0000\n" "Last-Translator: Thomas Perl \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/gpodder/" "language/zh_CN/)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: src/gpodder/config.py:55 #, python-format msgid "gPodder on %s" msgstr "gPodder 在 %s" #: src/gpodder/util.py:419 #, python-format msgid "%(count)d day ago" msgid_plural "%(count)d days ago" msgstr[0] "%(count)d 日之前" #: src/gpodder/util.py:495 msgid "Today" msgstr "今日" #: src/gpodder/util.py:497 msgid "Yesterday" msgstr "昨日" #: src/gpodder/util.py:540 src/gpodder/util.py:543 msgid "(unknown)" msgstr "(不明)" #: src/gpodder/util.py:1223 src/gpodder/util.py:1242 #, python-format msgid "%(count)d second" msgid_plural "%(count)d seconds" msgstr[0] "%(count)d 秒" #: src/gpodder/util.py:1236 #, python-format msgid "%(count)d hour" msgid_plural "%(count)d hours" msgstr[0] "%(count)d 小时" #: src/gpodder/util.py:1239 #, python-format msgid "%(count)d minute" msgid_plural "%(count)d minutes" msgstr[0] "%(count)d 分" #: src/gpodder/util.py:1245 msgid "and" msgstr " " #: src/gpodder/sync.py:195 #, fuzzy msgid "Cancelled by user" msgstr "取消" #: src/gpodder/sync.py:198 msgid "Writing data to disk" msgstr "" #: src/gpodder/sync.py:287 msgid "Opening iPod database" msgstr "" #: src/gpodder/sync.py:297 #, fuzzy msgid "iPod opened" msgstr "打开过的" #: src/gpodder/sync.py:308 msgid "Saving iPod database" msgstr "" #: src/gpodder/sync.py:313 msgid "Writing extended gtkpod database" msgstr "" #: src/gpodder/sync.py:389 src/gpodder/sync.py:649 src/gpodder/sync.py:843 #, fuzzy, python-format msgid "Removing %s" msgstr "移除 %s" #: src/gpodder/sync.py:404 src/gpodder/sync.py:517 #, fuzzy, python-format msgid "Adding %s" msgstr "添加播客..." #: src/gpodder/sync.py:420 #, python-format msgid "Error copying %(episode)s: Not enough free space on %(mountpoint)s" msgstr "" #: src/gpodder/sync.py:507 #, fuzzy msgid "Opening MP3 player" msgstr "打开播放器错误" #: src/gpodder/sync.py:510 #, fuzzy msgid "MP3 player opened" msgstr "从未打开的" #: src/gpodder/sync.py:572 src/gpodder/sync.py:580 #, fuzzy, python-format msgid "Error opening %(filename)s: %(message)s" msgstr "HTTP错误 %(code)s: %(message)s" #: src/gpodder/sync.py:749 src/gpodder/sync.py:755 msgid "MTP device" msgstr "" #: src/gpodder/sync.py:762 msgid "Opening the MTP device" msgstr "" #: src/gpodder/sync.py:772 #, fuzzy, python-format msgid "%s opened" msgstr "打开过的" #: src/gpodder/sync.py:777 #, python-format msgid "Closing %s" msgstr "" #: src/gpodder/sync.py:785 #, python-format msgid "%s closed" msgstr "" #: src/gpodder/sync.py:790 bin/gpo:658 #, fuzzy, python-format msgid "Adding %s..." msgstr "添加播客..." #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Added" msgstr "已添加" #: src/gpodder/sync.py:892 src/gpodder/download.py:526 msgid "Queued" msgstr "已入序" #: src/gpodder/sync.py:892 msgid "Synchronizing" msgstr "" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 #: src/gpodder/qmlui/__init__.py:69 msgid "Finished" msgstr "已完成" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Failed" msgstr "失败" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Cancelled" msgstr "取消" #: src/gpodder/sync.py:893 src/gpodder/download.py:527 msgid "Paused" msgstr "暂停" #: src/gpodder/sync.py:1049 src/gpodder/download.py:870 #, python-format msgid "Error: %s" msgstr "错误 %s" #: src/gpodder/my.py:176 #, python-format msgid "Add %s" msgstr "添加 %s" #: src/gpodder/my.py:178 #, python-format msgid "Remove %s" msgstr "移除 %s" #: src/gpodder/flattr.py:211 msgid "Not enough means to flattr" msgstr "" #: src/gpodder/flattr.py:213 msgid "Item does not exist on Flattr" msgstr "" #: src/gpodder/flattr.py:215 msgid "Already flattred or own item" msgstr "" #: src/gpodder/flattr.py:217 msgid "Invalid request" msgstr "" #: src/gpodder/flattr.py:223 msgid "No internet connection" msgstr "" #: src/gpodder/flattr.py:228 #, fuzzy msgid "No description" msgstr "无介绍" #: src/gpodder/model.py:448 src/gpodder/plugins/soundcloud.py:155 msgid "No description available" msgstr "无介绍" #: src/gpodder/model.py:679 msgid "unknown" msgstr "未知" #: src/gpodder/model.py:744 msgid "Default" msgstr "" #: src/gpodder/model.py:745 msgid "Only keep latest" msgstr "" #: src/gpodder/model.py:777 src/gpodder/model.py:1209 #: src/gpodder/extensions.py:59 msgid "Other" msgstr "其他" #: src/gpodder/model.py:1192 src/gpodder/model.py:1207 msgid "Video" msgstr "视频" #: src/gpodder/model.py:1205 msgid "Audio" msgstr "音频" #: src/gpodder/download.py:328 msgid "Wrong username/password" msgstr "错误的 用户名/密码" #: src/gpodder/download.py:526 src/gpodder/gtkui/model.py:328 msgid "Downloading" msgstr "下载中" #: src/gpodder/download.py:853 msgid "Missing content from server" msgstr "服务端缺失内容" #: src/gpodder/download.py:859 #, python-format msgid "I/O Error: %(error)s: %(filename)s" msgstr "I/O错误 %(error)s: %(filename)s" #: src/gpodder/download.py:866 #, python-format msgid "HTTP Error %(code)s: %(message)s" msgstr "HTTP错误 %(code)s: %(message)s" #: src/gpodder/extensions.py:55 msgid "Desktop Integration" msgstr "" #: src/gpodder/extensions.py:56 #, fuzzy msgid "Interface" msgstr "整型" #: src/gpodder/extensions.py:57 #, fuzzy msgid "Post download" msgstr "清空选择" #: src/gpodder/extensions.py:100 msgid "No description for this extension." msgstr "" #: src/gpodder/extensions.py:213 #, python-format msgid "Command not found: %(command)s" msgstr "" #: src/gpodder/extensions.py:229 #, python-format msgid "Need at least one of the following commands: %(list_of_commands)s" msgstr "" #: src/gpodder/extensions.py:266 #, python-format msgid "Python module not found: %(module)s" msgstr "" #: src/gpodder/gtkui/desktopfile.py:65 #, python-format msgid "Command: %s" msgstr "命令: %s" #: src/gpodder/gtkui/desktopfile.py:111 msgid "Default application" msgstr "默认应用程序" #: src/gpodder/gtkui/main.py:210 share/applications/gpodder.desktop.in.h:1 msgid "gPodder" msgstr "gPodder" #: src/gpodder/gtkui/main.py:290 src/gpodder/qmlui/__init__.py:1107 #: src/gpodder/qmlui/__init__.py:1111 msgid "Loading incomplete downloads" msgstr "读取未完成的下载" #: src/gpodder/gtkui/main.py:291 msgid "Some episodes have not finished downloading in a previous session." msgstr "上一次,有些片段未完成下载。" #: src/gpodder/gtkui/main.py:293 #, python-format msgid "%(count)d partial file" msgid_plural "%(count)d partial files" msgstr[0] "%(count)d 个不完整文件" #: src/gpodder/gtkui/main.py:308 msgid "Resume all" msgstr "全部启动" #: src/gpodder/gtkui/main.py:318 src/gpodder/qmlui/__init__.py:1137 msgid "Incomplete downloads from a previous session were found." msgstr "发现上一次留下的未完成下载" #: src/gpodder/gtkui/main.py:418 msgid "Action" msgstr "指令" #: src/gpodder/gtkui/main.py:465 msgid "Confirm changes from gpodder.net" msgstr "证实gpodder.net的变动" #: src/gpodder/gtkui/main.py:466 msgid "Select the actions you want to carry out." msgstr "选择想要执行的指令" #: src/gpodder/gtkui/main.py:506 msgid "Uploading subscriptions" msgstr "上传订阅项目" #: src/gpodder/gtkui/main.py:507 msgid "Your subscriptions are being uploaded to the server." msgstr "订阅的计划已经上传到服务器" #: src/gpodder/gtkui/main.py:512 msgid "List uploaded successfully." msgstr "列表上传成功" #: src/gpodder/gtkui/main.py:519 msgid "Error while uploading" msgstr "上传错误" #: src/gpodder/gtkui/main.py:804 src/gpodder/gtkui/main.py:937 #: src/gpodder/gtkui/main.py:2650 src/gpodder/gtkui/main.py:2847 #: src/gpodder/gtkui/desktop/episodeselector.py:132 #: src/gpodder/gtkui/desktop/sync.py:270 msgid "Episode" msgstr "片段" #: src/gpodder/gtkui/main.py:823 msgid "Size" msgstr "大小" #: src/gpodder/gtkui/main.py:828 msgid "Duration" msgstr "时间长度" #: src/gpodder/gtkui/main.py:832 msgid "Released" msgstr "发布时间" #: src/gpodder/gtkui/main.py:859 msgid "Visible columns" msgstr "可见列" #: src/gpodder/gtkui/main.py:957 src/gpodder/gtkui/main.py:1117 #: share/gpodder/ui/gtk/gpodder.ui.h:46 msgid "Progress" msgstr "进度" #: src/gpodder/gtkui/main.py:991 share/gpodder/ui/qml/EpisodeList.qml:44 msgid "Loading episodes" msgstr "读取片段信息" #: src/gpodder/gtkui/main.py:994 msgid "No episodes in current view" msgstr "当前视图无片段" #: src/gpodder/gtkui/main.py:996 msgid "No episodes available" msgstr "没有可用的片段" #: src/gpodder/gtkui/main.py:1002 msgid "No podcasts in this view" msgstr "此视图无片段" #: src/gpodder/gtkui/main.py:1004 msgid "No subscriptions" msgstr "" #: src/gpodder/gtkui/main.py:1006 msgid "No active tasks" msgstr "" #: src/gpodder/gtkui/main.py:1121 src/gpodder/gtkui/main.py:1123 #, python-format msgid "%(count)d active" msgid_plural "%(count)d active" msgstr[0] "" #: src/gpodder/gtkui/main.py:1125 #, python-format msgid "%(count)d failed" msgid_plural "%(count)d failed" msgstr[0] "" #: src/gpodder/gtkui/main.py:1127 #, python-format msgid "%(count)d queued" msgid_plural "%(count)d queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1141 #, python-format msgid "downloading %(count)d file" msgid_plural "downloading %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1151 #, python-format msgid "synchronizing %(count)d file" msgid_plural "synchronizing %(count)d files" msgstr[0] "" #: src/gpodder/gtkui/main.py:1153 #, python-format msgid "%(queued)d task queued" msgid_plural "%(queued)d tasks queued" msgstr[0] "" #: src/gpodder/gtkui/main.py:1177 msgid "Please report this problem and restart gPodder:" msgstr "" #: src/gpodder/gtkui/main.py:1177 msgid "Unhandled exception" msgstr "" #: src/gpodder/gtkui/main.py:1244 #, python-format msgid "Feedparser error: %s" msgstr "" #: src/gpodder/gtkui/main.py:1380 #, fuzzy msgid "Could not download some episodes:" msgstr "下载的片段" #: src/gpodder/gtkui/main.py:1382 src/gpodder/gtkui/main.py:1385 msgid "Downloads finished" msgstr "下载完成" #: src/gpodder/gtkui/main.py:1388 msgid "Downloads failed" msgstr "下载失败" #: src/gpodder/gtkui/main.py:1392 #, fuzzy msgid "Could not sync some episodes:" msgstr "%(count)d 秒" #: src/gpodder/gtkui/main.py:1394 src/gpodder/gtkui/main.py:1397 msgid "Device synchronization finished" msgstr "" #: src/gpodder/gtkui/main.py:1400 msgid "Device synchronization failed" msgstr "" #: src/gpodder/gtkui/main.py:1443 #, python-format msgid "%(count)d more episode" msgid_plural "%(count)d more episodes" msgstr[0] "" #: src/gpodder/gtkui/main.py:1516 src/gpodder/gtkui/main.py:1811 #: share/gpodder/ui/gtk/gpodder.ui.h:25 msgid "Episode details" msgstr "片段细节" #: src/gpodder/gtkui/main.py:1527 msgid "Start download now" msgstr "开始下载" #: src/gpodder/gtkui/main.py:1529 src/gpodder/gtkui/main.py:1739 #: src/gpodder/gtkui/desktop/podcastdirectory.py:64 #: src/gpodder/gtkui/desktop/episodeselector.py:144 #: share/gpodder/ui/gtk/gpodder.ui.h:20 #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:4 #: share/gpodder/ui/qml/Main.qml:342 #: share/gpodder/ui/qml/EpisodeActions.qml:20 msgid "Download" msgstr "下载" #: src/gpodder/gtkui/main.py:1530 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 src/gpodder/qmlui/__init__.py:658 #: share/gpodder/ui/gtk/gpodder.ui.h:21 share/gpodder/ui/qml/Main.qml:484 #: share/gpodder/ui/qml/EpisodeActions.qml:28 #: share/gpodder/ui/qml/Subscribe.qml:154 msgid "Cancel" msgstr "取消" #: src/gpodder/gtkui/main.py:1531 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Pause" msgstr "暂停" #: src/gpodder/gtkui/main.py:1533 msgid "Remove from list" msgstr "从列表中移除" #: src/gpodder/gtkui/main.py:1572 share/gpodder/ui/gtk/gpodder.ui.h:13 msgid "Update podcast" msgstr "更新播客" #: src/gpodder/gtkui/main.py:1579 #, fuzzy msgid "Open download folder" msgstr "下载的文件" #: src/gpodder/gtkui/main.py:1585 src/gpodder/qmlui/__init__.py:492 msgid "Mark episodes as old" msgstr "标记片段为旧" #: src/gpodder/gtkui/main.py:1589 src/gpodder/gtkui/main.py:1798 #: src/gpodder/qmlui/__init__.py:756 msgid "Archive" msgstr "收藏" #: src/gpodder/gtkui/main.py:1594 msgid "Remove podcast" msgstr "移除播客" #: src/gpodder/gtkui/main.py:1609 share/gpodder/ui/gtk/gpodder.ui.h:10 msgid "Podcast settings" msgstr "" #: src/gpodder/gtkui/main.py:1669 msgid "Error converting file." msgstr "转换文件错误" #: src/gpodder/gtkui/main.py:1669 msgid "Bluetooth file transfer" msgstr "蓝牙文件传输" #: src/gpodder/gtkui/main.py:1729 msgid "Preview" msgstr "预览" #: src/gpodder/gtkui/main.py:1731 share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Stream" msgstr "流媒体" #: src/gpodder/gtkui/main.py:1775 msgid "Send to" msgstr "发送至" #: src/gpodder/gtkui/main.py:1777 msgid "Local folder" msgstr "本地文件夹" #: src/gpodder/gtkui/main.py:1782 msgid "Bluetooth device" msgstr "蓝牙设备" #: src/gpodder/gtkui/main.py:1789 src/gpodder/qmlui/__init__.py:66 msgid "New" msgstr "新" #: src/gpodder/gtkui/main.py:1805 src/gpodder/gtkui/flattr.py:54 #: src/gpodder/gtkui/desktop/preferences.py:363 msgid "Flattr this" msgstr "" #: src/gpodder/gtkui/main.py:1936 src/gpodder/gtkui/main.py:2707 #: src/gpodder/gtkui/desktop/preferences.py:453 msgid "Flattr status" msgstr "" #: src/gpodder/gtkui/main.py:1969 msgid "Please check your media player settings in the preferences dialog." msgstr "请在首选项对话框检查媒体播放器设置" #: src/gpodder/gtkui/main.py:1970 msgid "Error opening player" msgstr "打开播放器错误" #: src/gpodder/gtkui/main.py:2211 msgid "Adding podcasts" msgstr "添加播客" #: src/gpodder/gtkui/main.py:2212 msgid "Please wait while episode information is downloaded." msgstr "" #: src/gpodder/gtkui/main.py:2219 msgid "Existing subscriptions skipped" msgstr "" #: src/gpodder/gtkui/main.py:2220 msgid "You are already subscribed to these podcasts:" msgstr "" #: src/gpodder/gtkui/main.py:2228 msgid "Podcast requires authentication" msgstr "" #: src/gpodder/gtkui/main.py:2229 #, python-format msgid "Please login to %s:" msgstr "" #: src/gpodder/gtkui/main.py:2237 src/gpodder/gtkui/main.py:2332 msgid "Authentication failed" msgstr "" #: src/gpodder/gtkui/main.py:2243 msgid "Website redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2244 #, python-format msgid "The URL %(url)s redirects to %(target)s." msgstr "" #: src/gpodder/gtkui/main.py:2245 msgid "Do you want to visit the website now?" msgstr "" #: src/gpodder/gtkui/main.py:2254 msgid "Could not add some podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2255 msgid "Some podcasts could not be added to your list:" msgstr "" #: src/gpodder/gtkui/main.py:2257 msgid "Unknown" msgstr "" #: src/gpodder/gtkui/main.py:2341 msgid "Redirection detected" msgstr "" #: src/gpodder/gtkui/main.py:2375 msgid "Merging episode actions" msgstr "" #: src/gpodder/gtkui/main.py:2376 msgid "Episode actions from gpodder.net are merged." msgstr "" #: src/gpodder/gtkui/main.py:2401 msgid "Cancelling..." msgstr "" #: src/gpodder/gtkui/main.py:2410 src/gpodder/qmlui/__init__.py:581 msgid "Please connect to a network, then try again." msgstr "" #: src/gpodder/gtkui/main.py:2411 src/gpodder/qmlui/__init__.py:580 #, fuzzy msgid "No network connection" msgstr "无介绍" #: src/gpodder/gtkui/main.py:2432 #, python-format msgid "Updating %(count)d feed..." msgid_plural "Updating %(count)d feeds..." msgstr[0] "" #: src/gpodder/gtkui/main.py:2450 #, python-format msgid "Error while updating %(url)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2452 #, python-format msgid "The feed at %(url)s could not be updated." msgstr "" #: src/gpodder/gtkui/main.py:2453 msgid "Error while updating feed" msgstr "" #: src/gpodder/gtkui/main.py:2468 #, python-format msgid "Updated %(podcast)s (%(position)d/%(total)d)" msgstr "" #: src/gpodder/gtkui/main.py:2495 msgid "No new episodes" msgstr "" #: src/gpodder/gtkui/main.py:2508 #, python-format msgid "Downloading %(count)d new episode." msgid_plural "Downloading %(count)d new episodes." msgstr[0] "" #: src/gpodder/gtkui/main.py:2509 src/gpodder/gtkui/main.py:2513 #: src/gpodder/gtkui/main.py:2865 msgid "New episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2512 #, python-format msgid "%(count)d new episode added to download list." msgid_plural "%(count)d new episodes added to download list." msgstr[0] "" #: src/gpodder/gtkui/main.py:2519 #, python-format msgid "%(count)d new episode available" msgid_plural "%(count)d new episodes available" msgstr[0] "" #: src/gpodder/gtkui/main.py:2538 msgid "Quit gPodder" msgstr "" #: src/gpodder/gtkui/main.py:2539 msgid "" "You are downloading episodes. You can resume downloads the next time you " "start gPodder. Do you want to quit now?" msgstr "" #: src/gpodder/gtkui/main.py:2588 msgid "Episodes are locked" msgstr "" #: src/gpodder/gtkui/main.py:2589 msgid "" "The selected episodes are locked. Please unlock the episodes that you want " "to delete before trying to delete them." msgstr "" #: src/gpodder/gtkui/main.py:2594 src/gpodder/qmlui/__init__.py:320 #, python-format msgid "Delete %(count)d episode?" msgid_plural "Delete %(count)d episodes?" msgstr[0] "" #: src/gpodder/gtkui/main.py:2595 msgid "Deleting episodes removes downloaded files." msgstr "" #: src/gpodder/gtkui/main.py:2600 msgid "Deleting episodes" msgstr "" #: src/gpodder/gtkui/main.py:2601 msgid "Please wait while episodes are deleted" msgstr "" #: src/gpodder/gtkui/main.py:2653 #, python-format msgid "Select older than %(count)d day" msgid_plural "Select older than %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/main.py:2655 msgid "Select played" msgstr "" #: src/gpodder/gtkui/main.py:2656 msgid "Select finished" msgstr "" #: src/gpodder/gtkui/main.py:2660 msgid "Select the episodes you want to delete:" msgstr "" #: src/gpodder/gtkui/main.py:2676 share/gpodder/ui/gtk/gpodder.ui.h:4 #: share/gpodder/ui/qml/Main.qml:352 msgid "Delete episodes" msgstr "删除片段" #: src/gpodder/gtkui/main.py:2741 src/gpodder/gtkui/main.py:2971 #: src/gpodder/gtkui/main.py:3072 msgid "No podcast selected" msgstr "" #: src/gpodder/gtkui/main.py:2742 msgid "Please select a podcast in the podcasts list to update." msgstr "" #: src/gpodder/gtkui/main.py:2807 #, python-format msgid "Download error while downloading %(episode)s: %(message)s" msgstr "" #: src/gpodder/gtkui/main.py:2808 msgid "Download error" msgstr "下载错误" #: src/gpodder/gtkui/main.py:2850 msgid "Select the episodes you want to download:" msgstr "" #: src/gpodder/gtkui/main.py:2873 src/gpodder/qmlui/__init__.py:753 msgid "Mark as old" msgstr "" #: src/gpodder/gtkui/main.py:2881 msgid "Please check for new episodes later." msgstr "" #: src/gpodder/gtkui/main.py:2882 msgid "No new episodes available" msgstr "" #: src/gpodder/gtkui/main.py:2937 msgid "Login to gpodder.net" msgstr "登录 gpodder.net" #: src/gpodder/gtkui/main.py:2938 msgid "Please login to download your subscriptions." msgstr "" #: src/gpodder/gtkui/main.py:2953 msgid "Subscriptions on gpodder.net" msgstr "" #: src/gpodder/gtkui/main.py:2972 msgid "Please select a podcast in the podcasts list to edit." msgstr "" #: src/gpodder/gtkui/main.py:2987 #: src/gpodder/gtkui/desktop/podcastdirectory.py:75 msgid "Podcast" msgstr "" #: src/gpodder/gtkui/main.py:2993 share/gpodder/ui/gtk/gpodder.ui.h:12 msgid "Remove podcasts" msgstr "" #: src/gpodder/gtkui/main.py:2994 msgid "Select the podcast you want to remove." msgstr "" #: src/gpodder/gtkui/main.py:2998 #: src/gpodder/gtkui/desktop/episodeselector.py:105 #: share/gpodder/ui/qml/MediaPlayer.qml:243 msgid "Remove" msgstr "" #: src/gpodder/gtkui/main.py:3007 msgid "Removing podcast" msgstr "" #: src/gpodder/gtkui/main.py:3008 msgid "Please wait while the podcast is removed" msgstr "" #: src/gpodder/gtkui/main.py:3009 msgid "Do you really want to remove this podcast and its episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3011 msgid "Removing podcasts" msgstr "" #: src/gpodder/gtkui/main.py:3012 msgid "Please wait while the podcasts are removed" msgstr "" #: src/gpodder/gtkui/main.py:3013 msgid "Do you really want to remove the selected podcasts and their episodes?" msgstr "" #: src/gpodder/gtkui/main.py:3073 msgid "Please select a podcast in the podcasts list to remove." msgstr "" #: src/gpodder/gtkui/main.py:3083 msgid "OPML files" msgstr "" #: src/gpodder/gtkui/main.py:3088 msgid "Import from OPML" msgstr "" #: src/gpodder/gtkui/main.py:3102 msgid "Import podcasts from OPML file" msgstr "" #: src/gpodder/gtkui/main.py:3109 msgid "Nothing to export" msgstr "" #: src/gpodder/gtkui/main.py:3110 msgid "" "Your list of podcast subscriptions is empty. Please subscribe to some " "podcasts first before trying to export your subscription list." msgstr "" #: src/gpodder/gtkui/main.py:3114 msgid "Export to OPML" msgstr "" #: src/gpodder/gtkui/main.py:3125 #, python-format msgid "%(count)d subscription exported" msgid_plural "%(count)d subscriptions exported" msgstr[0] "" #: src/gpodder/gtkui/main.py:3126 msgid "Your podcast list has been successfully exported." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "Could not export OPML to file. Please check your permissions." msgstr "" #: src/gpodder/gtkui/main.py:3128 msgid "OPML export failed" msgstr "" #: src/gpodder/gtkui/main.py:3155 #, fuzzy msgid "No updates available" msgstr "没有可用的片段" #: src/gpodder/gtkui/main.py:3156 msgid "You have the latest version of gPodder." msgstr "" #: src/gpodder/gtkui/main.py:3160 #, fuzzy msgid "New version available" msgstr "无介绍" #: src/gpodder/gtkui/main.py:3162 #, python-format msgid "Installed version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3163 #, python-format msgid "Newest version: %s" msgstr "" #: src/gpodder/gtkui/main.py:3164 #, fuzzy, python-format msgid "Release date: %s" msgstr "发布 %s" #: src/gpodder/gtkui/main.py:3166 #, fuzzy msgid "Download the latest version from gpodder.org?" msgstr "下载错误" #: src/gpodder/gtkui/main.py:3179 share/gpodder/ui/qml/main_default.qml:48 msgid "About gPodder" msgstr "关于 gPodder" #: src/gpodder/gtkui/main.py:3206 msgid "Donate / Wishlist" msgstr "捐赠 / 愿望" #: src/gpodder/gtkui/main.py:3209 msgid "Report a problem" msgstr "报告一个问题" #: src/gpodder/gtkui/main.py:3235 msgid "translator-credits" msgstr "" #: src/gpodder/gtkui/main.py:3237 msgid "Translation by:" msgstr "" #: src/gpodder/gtkui/main.py:3241 msgid "Thanks to:" msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "Please select an episode from the episode list to display shownotes." msgstr "" #: src/gpodder/gtkui/main.py:3320 msgid "No episode selected" msgstr "未选中新片段" #: src/gpodder/gtkui/main.py:3514 msgid "Cannot start gPodder" msgstr "无法启动 gPodder" #: src/gpodder/gtkui/main.py:3515 #, python-format msgid "D-Bus error: %s" msgstr "D-Bus 错误 %s" #: src/gpodder/gtkui/shownotes.py:62 src/gpodder/gtkui/model.py:70 #: src/gpodder/gtkui/model.py:88 src/gpodder/gtkui/model.py:238 #, python-format msgid "from %s" msgstr "从 %s" #: src/gpodder/gtkui/config.py:50 msgid "Integer" msgstr "整型" #: src/gpodder/gtkui/config.py:52 msgid "Float" msgstr "浮点" #: src/gpodder/gtkui/config.py:54 msgid "Boolean" msgstr "布伦" #: src/gpodder/gtkui/config.py:56 msgid "String" msgstr "字符串" #: src/gpodder/gtkui/flattr.py:43 src/gpodder/qmlui/__init__.py:236 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:8 msgid "Sign in" msgstr "" #: src/gpodder/gtkui/flattr.py:51 msgid "Flattred" msgstr "" #: src/gpodder/gtkui/model.py:69 #, python-format msgid "released %s" msgstr "发布 %s" #: src/gpodder/gtkui/model.py:81 src/gpodder/gtkui/model.py:394 msgid "played" msgstr "播放过的" #: src/gpodder/gtkui/model.py:83 msgid "unplayed" msgstr "未播放的" #: src/gpodder/gtkui/model.py:86 msgid "today" msgstr "今日" #: src/gpodder/gtkui/model.py:87 #, python-format msgid "downloaded %s" msgstr "下载的 %s" #: src/gpodder/gtkui/model.py:338 src/gpodder/qmlui/__init__.py:68 msgid "Deleted" msgstr "删除的" #: src/gpodder/gtkui/model.py:343 msgid "New episode" msgstr "新片段" #: src/gpodder/gtkui/model.py:357 msgid "Downloaded episode" msgstr "下载的片段" #: src/gpodder/gtkui/model.py:360 msgid "Downloaded video episode" msgstr "下载的视频片段" #: src/gpodder/gtkui/model.py:363 msgid "Downloaded image" msgstr "下载的图片" #: src/gpodder/gtkui/model.py:366 msgid "Downloaded file" msgstr "下载的文件" #: src/gpodder/gtkui/model.py:381 msgid "missing file" msgstr "缺失文件" #: src/gpodder/gtkui/model.py:385 msgid "never displayed" msgstr "从未显示的" #: src/gpodder/gtkui/model.py:387 msgid "never played" msgstr "从未播放的" #: src/gpodder/gtkui/model.py:389 msgid "never opened" msgstr "从未打开的" #: src/gpodder/gtkui/model.py:392 msgid "displayed" msgstr "显示过的" #: src/gpodder/gtkui/model.py:396 msgid "opened" msgstr "打开过的" #: src/gpodder/gtkui/model.py:398 msgid "deletion prevented" msgstr "删除被阻止" #: src/gpodder/gtkui/model.py:433 src/gpodder/qmlui/__init__.py:878 #: share/gpodder/ui/gtk/gpodder.ui.h:33 msgid "All episodes" msgstr "全部片段" #: src/gpodder/gtkui/model.py:434 msgid "from all podcasts" msgstr "" #: src/gpodder/gtkui/model.py:626 msgid "Subscription paused" msgstr "订阅暂停" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Nothing to paste." msgstr "没有可以粘贴的" #: src/gpodder/gtkui/interface/addpodcast.py:74 msgid "Clipboard is empty" msgstr "剪贴板为空" #: src/gpodder/gtkui/interface/common.py:160 #: share/gpodder/ui/qml/main_default.qml:246 msgid "Username" msgstr "用户名" #: src/gpodder/gtkui/interface/common.py:163 msgid "New user" msgstr "新用户" #: src/gpodder/gtkui/interface/common.py:170 msgid "Login" msgstr "登录" #: src/gpodder/gtkui/interface/common.py:172 msgid "Authentication required" msgstr "" #: src/gpodder/gtkui/interface/common.py:203 #: share/gpodder/ui/qml/main_default.qml:251 msgid "Password" msgstr "密码" #: src/gpodder/gtkui/interface/common.py:225 msgid "Select destination" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:34 msgid "Setting" msgstr "何止" #: src/gpodder/gtkui/interface/configeditor.py:41 msgid "Set to" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:81 #, python-format msgid "Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s" msgstr "" #: src/gpodder/gtkui/interface/configeditor.py:85 msgid "Error setting option" msgstr "错误设置" #: src/gpodder/gtkui/desktop/preferences.py:50 #: src/gpodder/gtkui/desktop/preferences.py:91 msgid "Do nothing" msgstr "什么都不做" #: src/gpodder/gtkui/desktop/preferences.py:51 msgid "Show episode list" msgstr "显示片段列表" #: src/gpodder/gtkui/desktop/preferences.py:52 msgid "Add to download list" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:53 msgid "Download immediately" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:71 msgid "None" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:72 msgid "Filesystem-based" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:92 #, fuzzy msgid "Mark as played" msgstr "标记为 新" #: src/gpodder/gtkui/desktop/preferences.py:93 msgid "Delete from gPodder" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:132 #, fuzzy msgid "Error" msgstr "错误 %s" #: src/gpodder/gtkui/desktop/preferences.py:149 #, python-format msgid "Custom (%(format_ids)s)" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:301 msgid "Name" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:352 #, fuzzy msgid "Documentation" msgstr "时间长度" #: src/gpodder/gtkui/desktop/preferences.py:357 msgid "Extension info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:367 msgid "Support the author" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:383 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:7 msgid "Please sign in with Flattr and Support Publishers" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:384 #: share/gpodder/ui/gtk/gpodderflattrsignin.ui.h:1 #: share/gpodder/ui/qml/main_default.qml:335 msgid "Sign in to Flattr" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:387 #, python-format msgid "Logged in as %(username)s" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:388 #: share/gpodder/ui/qml/main_default.qml:333 #: share/gpodder/ui/qml/main_default.qml:372 msgid "Sign out" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:397 msgid "Flattr integration requires WebKit/Gtk." msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:398 msgid "WebKit/Gtk not found" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:433 msgid "Extension cannot be activated" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:446 msgid "Extension module info" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:484 msgid "Configure audio player" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:485 #: src/gpodder/gtkui/desktop/preferences.py:495 msgid "Command:" msgstr "命令:" #: src/gpodder/gtkui/desktop/preferences.py:494 msgid "Configure video player" msgstr "设置视频播放器" #: src/gpodder/gtkui/desktop/preferences.py:506 #: src/gpodder/gtkui/desktop/preferences.py:524 msgid "manually" msgstr "手动" #: src/gpodder/gtkui/desktop/preferences.py:526 #, python-format msgid "after %(count)d day" msgid_plural "after %(count)d days" msgstr[0] "" #: src/gpodder/gtkui/desktop/preferences.py:556 msgid "Replace subscription list on server" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:557 msgid "" "Remote podcasts that have not been added locally will be removed on the " "server. Continue?" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:622 msgid "Select folder for mount point" msgstr "" #: src/gpodder/gtkui/desktop/preferences.py:637 msgid "Select folder for playlists" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:62 #: share/gpodder/ui/qml/Subscribe.qml:63 msgid "Search" msgstr "搜索" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "The specified URL does not provide any valid OPML podcast items." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:123 #: src/gpodder/gtkui/desktop/podcastdirectory.py:134 msgid "No feeds found" msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "There are no YouTube channels that would match this query." msgstr "" #: src/gpodder/gtkui/desktop/podcastdirectory.py:127 msgid "No channels found" msgstr "没有找到频道" #: src/gpodder/gtkui/desktop/episodeselector.py:288 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:2 #: share/gpodder/ui/qml/Main.qml:542 msgid "Select all" msgstr "选择全部" #: src/gpodder/gtkui/desktop/episodeselector.py:292 #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:3 #: share/gpodder/ui/qml/Main.qml:566 msgid "Select none" msgstr "清空选择" #: src/gpodder/gtkui/desktop/episodeselector.py:324 msgid "Nothing selected" msgstr "没有选中" #: src/gpodder/gtkui/desktop/episodeselector.py:325 #, python-format msgid "%(count)d episode" msgid_plural "%(count)d episodes" msgstr[0] "" #: src/gpodder/gtkui/desktop/episodeselector.py:327 #, python-format msgid "size: %s" msgstr "大小: %s" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, python-format msgid "Folder %s could not be created." msgstr "" #: src/gpodder/gtkui/desktop/deviceplaylist.py:98 #, fuzzy msgid "Error writing playlist" msgstr "打开播放器错误" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "Add section" msgstr "指令" #: src/gpodder/gtkui/desktop/channel.py:98 #, fuzzy msgid "New section:" msgstr "无介绍" #: src/gpodder/gtkui/desktop/channel.py:131 msgid "Select new podcast cover artwork" msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 msgid "You can only drop a single image or URL here." msgstr "" #: src/gpodder/gtkui/desktop/channel.py:157 #: src/gpodder/gtkui/desktop/channel.py:167 msgid "Drag and drop" msgstr "拖拽" #: src/gpodder/gtkui/desktop/channel.py:167 msgid "You can only drop local files and http:// URLs here." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:86 msgid "No device configured" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:87 #, fuzzy msgid "Please set up your device in the preferences dialog." msgstr "请在首选项对话框检查媒体播放器设置" #: src/gpodder/gtkui/desktop/sync.py:91 msgid "Cannot open device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:92 #, fuzzy msgid "Please check the settings in the preferences dialog." msgstr "请在首选项对话框检查媒体播放器设置" #: src/gpodder/gtkui/desktop/sync.py:139 msgid "Not enough space left on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:140 #, python-format msgid "" "Additional free space required: %(required_space)s\n" "Do you want to continue?" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:199 #, fuzzy msgid "Update successful" msgstr "列表上传成功" #: src/gpodder/gtkui/desktop/sync.py:200 msgid "The playlist on your MP3 player has been updated." msgstr "" #: src/gpodder/gtkui/desktop/sync.py:274 msgid "Episodes have been deleted on device" msgstr "" #: src/gpodder/gtkui/desktop/sync.py:285 #, fuzzy msgid "Error writing playlist files" msgstr "转换文件错误" #: src/gpodder/qmlui/__init__.py:64 msgid "All" msgstr "" #: src/gpodder/qmlui/__init__.py:65 #, fuzzy msgid "Hide deleted" msgstr "删除的" #: src/gpodder/qmlui/__init__.py:67 #, fuzzy msgid "Downloaded" msgstr "下载" #: src/gpodder/qmlui/__init__.py:70 #, fuzzy msgid "Archived" msgstr "收藏" #: src/gpodder/qmlui/__init__.py:71 #, fuzzy msgid "Videos" msgstr "视频" #: src/gpodder/qmlui/__init__.py:72 #, fuzzy msgid "Partially played" msgstr "标记为 新" #: src/gpodder/qmlui/__init__.py:73 #, fuzzy msgid "Unplayed downloads" msgstr "清空选择" #: src/gpodder/qmlui/__init__.py:244 #, python-format msgid "Flattred (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:248 #, python-format msgid "Flattr this (%(count)d)" msgstr "" #: src/gpodder/qmlui/__init__.py:262 msgid "Sign in to Flattr in the settings." msgstr "" #: src/gpodder/qmlui/__init__.py:265 #, fuzzy msgid "Flattring episode..." msgstr "读取片段信息" #: src/gpodder/qmlui/__init__.py:289 msgid "Could not log in to Flattr." msgstr "" #: src/gpodder/qmlui/__init__.py:321 src/gpodder/qmlui/__init__.py:735 #: src/gpodder/qmlui/__init__.py:760 share/gpodder/ui/gtk/gpodder.ui.h:22 #: share/gpodder/ui/qml/Main.qml:354 share/gpodder/ui/qml/Main.qml:480 #: share/gpodder/ui/qml/EpisodeActions.qml:44 msgid "Delete" msgstr "删除" #: src/gpodder/qmlui/__init__.py:421 msgid "Uploading subscriptions..." msgstr "" #: src/gpodder/qmlui/__init__.py:428 #, fuzzy msgid "Error on upload:" msgstr "上传错误" #: src/gpodder/qmlui/__init__.py:489 msgid "Update all" msgstr "更新全部" #: src/gpodder/qmlui/__init__.py:491 share/gpodder/ui/qml/Main.qml:334 msgid "Update" msgstr "更新" #: src/gpodder/qmlui/__init__.py:493 src/gpodder/qmlui/__init__.py:639 #: src/gpodder/qmlui/__init__.py:648 msgid "Rename" msgstr "重命名" #: src/gpodder/qmlui/__init__.py:494 msgid "Change section" msgstr "" #: src/gpodder/qmlui/__init__.py:495 src/gpodder/qmlui/__init__.py:617 #: share/gpodder/ui/gtk/gpodder.ui.h:11 msgid "Unsubscribe" msgstr "取消订阅" #: src/gpodder/qmlui/__init__.py:546 msgid "Merging episode actions..." msgstr "" #: src/gpodder/qmlui/__init__.py:550 #, python-format msgid "Merging episode actions (%d)" msgstr "" #: src/gpodder/qmlui/__init__.py:616 msgid "Remove this podcast and episodes?" msgstr "" #: src/gpodder/qmlui/__init__.py:638 msgid "New section name:" msgstr "" #: src/gpodder/qmlui/__init__.py:647 msgid "New name:" msgstr "新名称:" #: src/gpodder/qmlui/__init__.py:735 msgid "Delete this episode?" msgstr "删除此片段?" #: src/gpodder/qmlui/__init__.py:753 msgid "Mark as new" msgstr "标记为 新" #: src/gpodder/qmlui/__init__.py:756 msgid "Allow deletion" msgstr "允许删除" #: src/gpodder/qmlui/__init__.py:762 msgid "Add to play queue" msgstr "" #: src/gpodder/qmlui/__init__.py:792 src/gpodder/qmlui/__init__.py:796 msgid "Adding podcasts..." msgstr "添加播客..." #: src/gpodder/qmlui/__init__.py:811 #, fuzzy msgid "Could not add some podcasts:" msgstr "下载的片段" #: src/gpodder/qmlui/__init__.py:1138 #, fuzzy msgid "Resume" msgstr "全部启动" #: src/gpodder/plugins/soundcloud.py:153 msgid "Unknown track" msgstr "" #: src/gpodder/plugins/soundcloud.py:180 #, python-format msgid "%s on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:189 #, python-format msgid "Tracks published by %s on Soundcloud." msgstr "" #: src/gpodder/plugins/soundcloud.py:216 #, python-format msgid "%s's favorites on Soundcloud" msgstr "" #: src/gpodder/plugins/soundcloud.py:222 #, python-format msgid "Tracks favorited by %s on Soundcloud." msgstr "" #: share/gpodder/extensions/ted_subtitles.py:16 msgid "Subtitle Downloader for TED Talks" msgstr "" #: share/gpodder/extensions/ted_subtitles.py:17 msgid "Downloads .srt subtitles for TED Talks Videos" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:26 msgid "Convert video files to MP4 for Rockbox" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:27 msgid "Converts all videos to a Rockbox-compatible format" msgstr "" #: share/gpodder/extensions/rockbox_convert2mp4.py:65 #: share/gpodder/extensions/video_converter.py:111 #: share/gpodder/extensions/audio_converter.py:111 msgid "File converted" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:10 msgid "Ubuntu App Indicator" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:11 msgid "Show a status indicator in the top bar." msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:39 msgid "Show main window" msgstr "" #: share/gpodder/extensions/ubuntu_appindicator.py:49 #: share/gpodder/ui/gtk/gpodder.ui.h:6 msgid "Quit" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:28 msgid "Show download progress on the taskbar" msgstr "" #: share/gpodder/extensions/taskbar_progress.py:29 msgid "Displays the progress on the Windows taskbar." msgstr "" #: share/gpodder/extensions/rename_download.py:16 #, fuzzy msgid "Rename episodes after download" msgstr "标记片段为旧" #: share/gpodder/extensions/rename_download.py:17 msgid "Rename episodes to \".\" on download" msgstr "" #: share/gpodder/extensions/video_converter.py:22 #, fuzzy msgid "Convert video files" msgstr "转换文件错误" #: share/gpodder/extensions/video_converter.py:23 msgid "Transcode video files to avi/mp4/m4v" msgstr "" #: share/gpodder/extensions/video_converter.py:86 #: share/gpodder/extensions/audio_converter.py:84 #, python-format msgid "Convert to %(format)s" msgstr "" #: share/gpodder/extensions/video_converter.py:114 #: share/gpodder/extensions/audio_converter.py:114 #, fuzzy msgid "Conversion failed" msgstr "转换文件错误" #: share/gpodder/extensions/rm_ogg_cover.py:37 msgid "Remove cover art from OGG files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:38 msgid "removes coverart from all downloaded ogg files" msgstr "" #: share/gpodder/extensions/rm_ogg_cover.py:66 #, fuzzy msgid "Remove cover art" msgstr "移除播客" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:16 msgid "Enqueue in media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:17 msgid "" "Add a context menu item for enqueueing episodes in installed media players" msgstr "" #: share/gpodder/extensions/enqueue_in_mediaplayer.py:26 msgid "Enqueue in" msgstr "" #: share/gpodder/extensions/update_feeds_on_startup.py:14 #, fuzzy msgid "Search for new episodes on startup" msgstr "显示片段列表" #: share/gpodder/extensions/update_feeds_on_startup.py:15 msgid "Starts the search for new episodes on startup" msgstr "" #: share/gpodder/extensions/normalize_audio.py:21 msgid "Normalize audio with re-encoding" msgstr "" #: share/gpodder/extensions/normalize_audio.py:22 msgid "Normalize the volume of audio files with normalize-audio" msgstr "" #: share/gpodder/extensions/normalize_audio.py:99 msgid "File normalized" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:11 msgid "Gtk Status Icon" msgstr "" #: share/gpodder/extensions/gtk_statusicon.py:12 msgid "Show a status icon for Gtk-based Desktops." msgstr "" #: share/gpodder/extensions/sonos.py:19 share/gpodder/extensions/sonos.py:78 msgid "Stream to Sonos" msgstr "" #: share/gpodder/extensions/sonos.py:20 msgid "Stream podcasts to Sonos speakers" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:10 msgid "Minimize on start" msgstr "" #: share/gpodder/extensions/minimize_on_start.py:11 msgid "Minimizes the gPodder window on startup." msgstr "" #: share/gpodder/extensions/audio_converter.py:20 #, fuzzy msgid "Convert audio files" msgstr "转换文件错误" #: share/gpodder/extensions/audio_converter.py:21 msgid "Transcode audio files to mp3/ogg" msgstr "" #: share/gpodder/extensions/tagging.py:45 msgid "Tag downloaded files using Mutagen" msgstr "" #: share/gpodder/extensions/tagging.py:46 msgid "Add episode and podcast titles to MP3/OGG tags" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:10 msgid "Ubuntu Unity Integration" msgstr "" #: share/gpodder/extensions/ubuntu_unity.py:11 msgid "Show download progress in the Unity Launcher icon." msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:1 #: share/gpodder/ui/qml/PodcastList.qml:40 msgid "Add a new podcast" msgstr "" #: share/gpodder/ui/gtk/gpodderaddpodcast.ui.h:2 msgid "URL:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:1 msgid "gPodder Podcast Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:2 msgid "Section:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:3 msgid "Disable feed updates (pause subscription)" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:4 msgid "Synchronize to MP3 player devices" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:5 msgid "Strategy:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:6 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:5 msgid "General" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:7 msgid "HTTP/FTP Authentication" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:8 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:11 msgid "Username:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:9 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:12 msgid "Password:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:10 msgid "Locations" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:11 msgid "Download to:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:12 msgid "Website:" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:13 msgid "website label" msgstr "" #: share/gpodder/ui/gtk/gpodderchannel.ui.h:14 msgid "Advanced" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:1 msgid "gPodder Configuration Editor" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:2 msgid "Search for:" msgstr "" #: share/gpodder/ui/gtk/gpodderconfigeditor.ui.h:3 msgid "Show All" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:1 msgid "_Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:2 #: share/gpodder/ui/qml/main_default.qml:33 msgid "Check for new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:3 msgid "Download new episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:5 #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:1 msgid "Preferences" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:7 msgid "_Subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:8 msgid "Discover new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:9 msgid "Add podcast via URL" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:14 msgid "Import from OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:15 msgid "Export to OPML file" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:16 msgid "Go to gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:17 msgid "_Episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:18 share/gpodder/ui/qml/Main.qml:348 #: share/gpodder/ui/qml/EpisodeActions.qml:36 msgid "Play" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:19 msgid "Open" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:23 msgid "Toggle new status" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:24 msgid "Change delete lock" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:26 msgid "E_xtras" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:27 #, fuzzy msgid "Sync to device" msgstr "蓝牙设备" #: share/gpodder/ui/gtk/gpodder.ui.h:28 msgid "_View" msgstr "视图" #: share/gpodder/ui/gtk/gpodder.ui.h:29 msgid "\"All episodes\" in podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:30 msgid "Use sections for podcast list" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:31 msgid "Toolbar" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:32 msgid "Episode descriptions" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:34 msgid "Hide deleted episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:35 msgid "Downloaded episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:36 msgid "Unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:37 msgid "Hide podcasts without episodes" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:38 msgid "_Help" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:39 msgid "User manual" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:40 msgid "Software updates" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:41 share/gpodder/ui/qml/Main.qml:328 msgid "Filter:" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:42 msgid "Podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:43 msgid "Limit rate to" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:44 msgid "KiB/s" msgstr "" #: share/gpodder/ui/gtk/gpodder.ui.h:45 msgid "Limit downloads to" msgstr "" #: share/gpodder/ui/gtk/gpodderepisodeselector.ui.h:1 msgid "Select episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:1 #, fuzzy msgid "Getting started" msgstr "何止" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:2 msgid "Welcome to gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:3 #, fuzzy msgid "Your podcast list is empty." msgstr "此视图无片段" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:4 msgid "Choose from a list of example podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:5 msgid "Add a podcast by entering its URL" msgstr "" #: share/gpodder/ui/gtk/gpodderwelcome.ui.h:6 #, fuzzy msgid "Restore my subscriptions from gpodder.net" msgstr "证实gpodder.net的变动" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:2 msgid "Audio player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:3 msgid "Video player:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:4 msgid "Preferred video format:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:6 msgid "Extensions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:9 msgid "Automatically flattr episodes on playback" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:10 msgid "Synchronize subscriptions and episode actions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:13 msgid "Replace list on server with local subscriptions" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:14 msgid "Device name:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:15 #: share/gpodder/ui/qml/main_default.qml:360 msgid "gpodder.net" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:16 msgid "Update interval:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:17 msgid "Maximum number of episodes per podcast:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:18 msgid "When new episodes are found:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:19 msgid "Updating" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:20 msgid "Delete played episodes:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:21 msgid "Remove played episodes even if unfinished" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:22 msgid "Also remove unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:23 msgid "Clean-up" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:24 #, fuzzy msgid "Device type:" msgstr "新名称:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:25 msgid "Mountpoint:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:26 msgid "After syncing an episode:" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:27 msgid "Create playlists on device" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:28 #, fuzzy msgid "Playlists Folder:" msgstr "剪贴板为空" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:29 msgid "Remove episodes deleted on device from gPodder" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:30 msgid "Only sync unplayed episodes" msgstr "" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:31 #, fuzzy msgid "Devices" msgstr "新名称:" #: share/gpodder/ui/gtk/gpodderpreferences.ui.h:32 msgid "Edit config" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:1 msgid "Find new podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:2 msgid "Select All" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:3 msgid "Select None" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:5 msgid "_OPML/Search" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:6 msgid "Top _podcasts" msgstr "" #: share/gpodder/ui/gtk/gpodderpodcastdirectory.ui.h:7 msgid "_YouTube" msgstr "" #: share/gpodder/ui/qml/main_default.qml:29 share/gpodder/ui/qml/Main.qml:322 msgid "Now playing" msgstr "正在播放" #: share/gpodder/ui/qml/main_default.qml:37 #, fuzzy msgid "Add podcast" msgstr "添加播客" #: share/gpodder/ui/qml/main_default.qml:41 #, fuzzy msgid "Settings" msgstr "何止" #: share/gpodder/ui/qml/main_default.qml:143 msgid "About" msgstr "" #: share/gpodder/ui/qml/main_default.qml:168 msgid "Thanks" msgstr "" #: share/gpodder/ui/qml/main_default.qml:178 msgid "Credits" msgstr "" #: share/gpodder/ui/qml/main_default.qml:239 #, fuzzy msgid "gPodder.net Login" msgstr "gPodder 在 %s" #: share/gpodder/ui/qml/main_default.qml:244 msgid "Credentials" msgstr "" #: share/gpodder/ui/qml/main_default.qml:256 #, fuzzy msgid "Device name" msgstr "新名称:" #: share/gpodder/ui/qml/main_default.qml:303 #, fuzzy msgid "gPodder settings" msgstr "gPodder 在 %s" #: share/gpodder/ui/qml/main_default.qml:308 msgid "Screen orientation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:312 msgid "Automatic rotation" msgstr "" #: share/gpodder/ui/qml/main_default.qml:318 msgid "Media indexing" msgstr "" #: share/gpodder/ui/qml/main_default.qml:322 #, fuzzy msgid "Show podcasts in Music app" msgstr "此视图无片段" #: share/gpodder/ui/qml/main_default.qml:354 msgid "Auto-Flattr on playback" msgstr "" #: share/gpodder/ui/qml/main_default.qml:364 msgid "Enable synchronization" msgstr "" #: share/gpodder/ui/qml/main_default.qml:374 #, fuzzy msgid "Sign in to gPodder.net" msgstr "登录 gpodder.net" #: share/gpodder/ui/qml/main_default.qml:393 msgid "Replace list on server" msgstr "" #: share/gpodder/ui/qml/main_default.qml:404 msgid "No account? Register here" msgstr "" #: share/gpodder/ui/qml/MediaPlayer.qml:242 share/gpodder/ui/qml/Main.qml:413 msgid "Play queue" msgstr "" #: share/gpodder/ui/qml/Main.qml:139 share/gpodder/ui/qml/Main.qml:418 #, fuzzy msgid "Playlist empty" msgstr "剪贴板为空" #: share/gpodder/ui/qml/Main.qml:169 #, fuzzy msgid "Episode added to playlist" msgstr "片段细节" #: share/gpodder/ui/qml/Main.qml:340 #, fuzzy msgid "Download episodes" msgstr "下载的片段" #: share/gpodder/ui/qml/Main.qml:346 #, fuzzy msgid "Playback episodes" msgstr "全部片段" #: share/gpodder/ui/qml/Main.qml:408 #: share/gpodder/ui/qml/EpisodeActions.qml:52 msgid "Shownotes" msgstr "短述" #: share/gpodder/ui/qml/Main.qml:553 #, fuzzy msgid "Select downloaded" msgstr "清空选择" #: share/gpodder/ui/qml/Main.qml:573 msgid "Invert selection" msgstr "" #: share/gpodder/ui/qml/PodcastList.qml:26 #, fuzzy msgid "No podcasts." msgstr "没有库存" #: share/gpodder/ui/qml/PodcastList.qml:26 msgid "Add your first podcast now." msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:46 #, fuzzy msgid "No episodes" msgstr "新片段" #: share/gpodder/ui/qml/EpisodeList.qml:46 msgid "Touch to change filter" msgstr "" #: share/gpodder/ui/qml/EpisodeList.qml:179 #, fuzzy msgid "Show episodes" msgstr "显示片段列表" #: share/gpodder/ui/qml/Subscribe.qml:53 msgid "Search term or URL" msgstr "搜索短语或URL" #: share/gpodder/ui/qml/Subscribe.qml:110 msgid "Toplist" msgstr "榜" #: share/gpodder/ui/qml/Subscribe.qml:131 #, fuzzy msgid "My gpodder.net" msgstr "gpodder.net驱动" #: share/gpodder/ui/qml/Subscribe.qml:131 msgid "Examples" msgstr "例" #: share/gpodder/ui/qml/Subscribe.qml:144 msgid "powered by gpodder.net" msgstr "gpodder.net驱动" #: share/gpodder/ui/qml/Subscribe.qml:153 #, fuzzy msgid "Subscribe" msgstr "取消订阅" #: share/gpodder/ui/qml/PlaybackBar.qml:12 #: share/gpodder/ui/qml/PlaybackBar.qml:14 #, python-format msgid "%(count)s minute" msgid_plural "%(count)s minutes" msgstr[0] "%(count)s 分钟" #: share/gpodder/ui/qml/PlaybackBar.qml:16 #: share/gpodder/ui/qml/PlaybackBar.qml:18 #, python-format msgid "%(count)s second" msgid_plural "%(count)s seconds" msgstr[0] "%(count)s 秒" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:14 #, fuzzy msgid "Pull down to refresh" msgstr "发布 %s" #: share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml:15 #, fuzzy msgid "Release to refresh" msgstr "发布 %s" #: bin/gpo:248 msgid "Podcast update requested by extensions." msgstr "" #: bin/gpo:252 msgid "Episode download requested by extensions." msgstr "" #: bin/gpo:305 #, python-format msgid "Invalid url: %s" msgstr "" #: bin/gpo:319 bin/gpo:395 bin/gpo:429 bin/gpo:559 bin/gpo:574 bin/gpo:667 #, python-format msgid "You are not subscribed to %s." msgstr "" #: bin/gpo:325 #, fuzzy, python-format msgid "Already subscribed to %s." msgstr "取消订阅" #: bin/gpo:331 #, python-format msgid "Cannot subscribe to %s." msgstr "" #: bin/gpo:347 #, python-format msgid "Successfully added %s." msgstr "" #: bin/gpo:365 msgid "This configuration option does not exist." msgstr "" #: bin/gpo:369 msgid "Can only set leaf configuration nodes." msgstr "" #: bin/gpo:383 #, python-format msgid "Renamed %(old_title)s to %(new_title)s." msgstr "" #: bin/gpo:399 #, fuzzy, python-format msgid "Unsubscribed from %s." msgstr "取消订阅" #: bin/gpo:473 #, fuzzy msgid "Updates disabled" msgstr "更新全部" #: bin/gpo:488 #, fuzzy, python-format msgid "%(count)d new episode" msgid_plural "%(count)d new episodes" msgstr[0] "%(count)d 秒" #: bin/gpo:494 #, fuzzy msgid "Checking for new episodes" msgstr "显示片段列表" #: bin/gpo:503 #, fuzzy, python-format msgid "Skipping %(podcast)s" msgstr "添加播客" #: bin/gpo:565 #, python-format msgid "Disabling feed update from %s." msgstr "" #: bin/gpo:580 #, python-format msgid "Enabling feed update from %s." msgstr "" #: bin/gpo:597 msgid "Listening on ALL network interfaces." msgstr "" #: bin/gpo:622 #, fuzzy msgid "No podcasts found." msgstr "没有库存" #: bin/gpo:636 msgid "Enter index to subscribe, ? for list" msgstr "" #: bin/gpo:650 bin/gpo:654 msgid "Invalid value." msgstr "" #: bin/gpo:671 #, python-format msgid "Invalid URL: %s" msgstr "" #: bin/gpo:674 #, python-format msgid "Changed URL from %(old_url)s to %(new_url)s." msgstr "" #: bin/gpo:730 #, python-format msgid "Syntax error: %(error)s" msgstr "" #: bin/gpo:824 msgid "Ambiguous command. Did you mean.." msgstr "" #: bin/gpo:828 msgid "The requested function is not available." msgstr "" #: bin/gpodder:108 #, fuzzy msgid "print logging output on the console" msgstr "显示debug输出到stdout" #: bin/gpodder:112 msgid "use the QML-based MeeGo 1.2 Harmattan UI" msgstr "" #: bin/gpodder:115 #, fuzzy msgid "subscribe to the feed at URL" msgstr "订阅给定的URL" #: bin/gpodder:120 msgid "Mac OS X application process number" msgstr "Mac OS X 程序进程号码" #: share/applications/gpodder.desktop.in.h:2 msgid "gPodder Podcast Client" msgstr "gPodder播客客户端" #: share/applications/gpodder.desktop.in.h:3 msgid "Podcast Client" msgstr "播客客户端" #: share/applications/gpodder.desktop.in.h:4 msgid "Subscribe to audio and video content from the web" msgstr "订阅网络音频、视频节目" #, fuzzy #~ msgid "Conversion failed from ogg to mp3" #~ msgstr "转换文件错误" #~ msgid "OK" #~ msgstr "确认" #~ msgid "Please wait..." #~ msgstr "请等待..." #~ msgid "Start the QML interface of gPodder" #~ msgstr "启动gPodder QML界面" gpodder-3.5.2/share/0000755000175000017500000000000012220346122013651 5ustar thpthp00000000000000gpodder-3.5.2/share/applications/0000755000175000017500000000000012220346122016337 5ustar thpthp00000000000000gpodder-3.5.2/share/applications/gpodder.desktop.in0000644000175000017500000000045212220076757022002 0ustar thpthp00000000000000[Desktop Entry] _Name=gPodder _X-GNOME-FullName=gPodder Podcast Client _GenericName=Podcast Client _Comment=Subscribe to audio and video content from the web Exec=gpodder Icon=gpodder Terminal=false Type=Application Categories=AudioVideo;Audio;Network;FileTransfer;News;GTK; StartupWMClass=gpodder gpodder-3.5.2/share/dbus-1/0000755000175000017500000000000012220346122014744 5ustar thpthp00000000000000gpodder-3.5.2/share/dbus-1/services/0000755000175000017500000000000012220346122016567 5ustar thpthp00000000000000gpodder-3.5.2/share/dbus-1/services/org.gpodder.service.in0000644000175000017500000000007512220076757023010 0ustar thpthp00000000000000[D-BUS Service] Name=org.gpodder Exec=__PREFIX__/bin/gpodder gpodder-3.5.2/share/gpodder/0000755000175000017500000000000012220346122015275 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/examples/0000755000175000017500000000000012220346122017113 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/examples/gpodder_mark_played.py0000644000175000017500000000216712220076757023505 0ustar thpthp00000000000000#!/usr/bin/python # Example script that can be used as post-play extension in media players # # Set the configuration options "audio_played_dbus" and "video_played_dbus" # to True to let gPodder leave the played status untouched when playing # files in the media player. After playback has finished, call this script # with the filename of the played episodes as single argument. The episode # will be marked as played inside gPodder. # # Usage: gpodder_mark_played.py /path/to/episode.mp3 # (the gPodder GUI has to be running) # # Thomas Perl ; 2009-09-09 import sys import os if len(sys.argv) != 2: print >>sys.stderr, """ Usage: %s /path/to/episode.mp3 """ % (sys.argv[0],) sys.exit(1) filename = os.path.abspath(sys.argv[1]) import dbus import gpodder session_bus = dbus.SessionBus() proxy = session_bus.get_object(gpodder.dbus_bus_name, \ gpodder.dbus_gui_object_path) interface = dbus.Interface(proxy, gpodder.dbus_interface) if not interface.mark_episode_played(filename): print >>sys.stderr, 'Warning: Could not mark episode as played.' sys.exit(2) gpodder-3.5.2/share/gpodder/examples/hello_world.py0000644000175000017500000000320612220076757022016 0ustar thpthp00000000000000 # Use a logger for debug output - this will be managed by gPodder import logging logger = logging.getLogger(__name__) # Provide some metadata that will be displayed in the gPodder GUI __title__ = 'Hello World Extension' __description__ = 'Explain in one sentence what this extension does.' __only_for__ = 'gtk, cli, qml' __authors__ = 'Thomas Perl ' class gPodderExtension: # The extension will be instantiated the first time it's used # You can do some sanity checks here and raise an Exception if # you want to prevent the extension from being loaded.. def __init__(self, container): self.container = container # This function will be called when the extension is enabled or # loaded. This is when you want to create helper objects or hook # into various parts of gPodder. def on_load(self): logger.info('Extension is being loaded.') print '='*40 print 'container:', self.container print 'container.manager:', self.container.manager print 'container.config:', self.container.config print 'container.manager.core:', self.container.manager.core print 'container.manager.core.db:', self.container.manager.core.db print 'container.manager.core.config:', self.container.manager.core.config print 'container.manager.core.model:', self.container.manager.core.model print '='*40 # This function will be called when the extension is disabled or # when gPodder shuts down. You can use this to destroy/delete any # objects that you created in on_load(). def on_unload(self): logger.info('Extension is being unloaded.') gpodder-3.5.2/share/gpodder/extensions/0000755000175000017500000000000012220346122017474 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/extensions/audio_converter.py0000644000175000017500000001041412220076757023254 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Convertes m4a audio files to mp3 # This requires ffmpeg to be installed. Also works as a context # menu item for already-downloaded files. # # (c) 2011-11-23 Bernd Schlapsi # Released under the same license terms as gPodder itself. import os import subprocess import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Convert audio files') __description__ = _('Transcode audio files to mp3/ogg') __authors__ = 'Bernd Schlapsi , Thomas Perl ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/AudioConverter' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/AudioConverter' __category__ = 'post-download' DefaultConfig = { 'use_ogg': False, # Set to True to convert to .ogg (otherwise .mp3) 'context_menu': True, # Show the conversion option in the context menu } class gPodderExtension: MIME_TYPES = ('audio/x-m4a', 'audio/mp4', 'audio/mp4a-latm', 'audio/ogg', ) EXT = ('.m4a', '.ogg') CMD = {'avconv': {'.mp3': ['-i', '%(old_file)s', '-q:a', '2', '-id3v2_version', '3', '-write_id3v1', '1', '%(new_file)s'], '.ogg': ['-i', '%(old_file)s', '-q:a', '2', '%(new_file)s'] }, 'ffmpeg': {'.mp3': ['-i', '%(old_file)s', '-q:a', '2', '-id3v2_version', '3', '-write_id3v1', '1', '%(new_file)s'], '.ogg': ['-i', '%(old_file)s', '-q:a', '2', '%(new_file)s'] } } def __init__(self, container): self.container = container self.config = self.container.config # Dependency checks self.command = self.container.require_any_command(['avconv', 'ffmpeg']) # extract command without extension (.exe on Windows) from command-string self.command_without_ext = os.path.basename(os.path.splitext(self.command)[0]) def on_episode_downloaded(self, episode): self._convert_episode(episode) def _get_new_extension(self): return ('.ogg' if self.config.use_ogg else '.mp3') def _check_source(self, episode): if episode.extension() == self._get_new_extension(): return False if episode.mime_type in self.MIME_TYPES: return True # Also check file extension (bug 1770) if episode.extension() in self.EXT: return True return False def on_episodes_context_menu(self, episodes): if not self.config.context_menu: return None if not all(e.was_downloaded(and_exists=True) for e in episodes): return None if not any(self._check_source(episode) for episode in episodes): return None target_format = ('OGG' if self.config.use_ogg else 'MP3') menu_item = _('Convert to %(format)s') % {'format': target_format} return [(menu_item, self._convert_episodes)] def _convert_episode(self, episode): if not self._check_source(episode): return new_extension = self._get_new_extension() old_filename = episode.local_filename(create=False) filename, old_extension = os.path.splitext(old_filename) new_filename = filename + new_extension cmd_param = self.CMD[self.command_without_ext][new_extension] cmd = [self.command] + \ [param % {'old_file': old_filename, 'new_file': new_filename} for param in cmd_param] ffmpeg = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = ffmpeg.communicate() if ffmpeg.returncode == 0: util.rename_episode_file(episode, new_filename) os.remove(old_filename) logger.info('Converted audio file to %(format)s.' % {'format': new_extension}) gpodder.user_extensions.on_notification_show(_('File converted'), episode.title) else: logger.warn('Error converting audio file: %s / %s', stdout, stderr) gpodder.user_extensions.on_notification_show(_('Conversion failed'), episode.title) def _convert_episodes(self, episodes): for episode in episodes: self._convert_episode(episode) gpodder-3.5.2/share/gpodder/extensions/enqueue_in_mediaplayer.py0000644000175000017500000000460712220076757024604 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Extension script to add a context menu item for enqueueing episodes in a player # Requirements: gPodder 3.x (or "tres" branch newer than 2011-06-08) # (c) 2011-06-08 Thomas Perl # Released under the same license terms as gPodder itself. import subprocess import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Enqueue in media players') __description__ = _('Add a context menu item for enqueueing episodes in installed media players') __authors__ = 'Thomas Perl , Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/EnqueueInMediaplayer' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/EnqueueInMediaplayer' __category__ = 'interface' __only_for__ = 'gtk' class Player: def __init__(self, application, command): self.title = '/'.join((_('Enqueue in'), application)) self.command = command self.gpodder = None def is_installed(self): return util.find_command(self.command[0]) is not None def enqueue_episodes(self, episodes): filenames = [episode.get_playback_url() for episode in episodes] subprocess.Popen(self.command + filenames, stdout=subprocess.PIPE, stderr=subprocess.PIPE) for episode in episodes: episode.playback_mark() self.gpodder.update_episode_list_icons(selected=True) PLAYERS = [ # Amarok, http://amarok.kde.org/ Player('Amarok', ['amarok', '--play', '--append']), # VLC, http://videolan.org/ Player('VLC', ['vlc', '--started-from-file', '--playlist-enqueue']), # Totem, https://live.gnome.org/Totem Player('Totem', ['totem', '--enqueue']), ] class gPodderExtension: def __init__(self, container): self.container = container # Only display media players that can be found at extension load time self.players = filter(lambda player: player.is_installed(), PLAYERS) def on_ui_object_available(self, name, ui_object): if name == 'gpodder-gtk': for p in self.players: p.gpodder = ui_object def on_episodes_context_menu(self, episodes): if not any(e.file_exists() for e in episodes): return None return [(p.title, p.enqueue_episodes) for p in self.players] gpodder-3.5.2/share/gpodder/extensions/gtk_statusicon.py0000644000175000017500000000313512220076757023127 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # Gtk Status Icon (gPodder bug 1495) # Thomas Perl ; 2012-07-31 # import gpodder _ = gpodder.gettext __title__ = _('Gtk Status Icon') __description__ = _('Show a status icon for Gtk-based Desktops.') __category__ = 'desktop-integration' __only_for__ = 'gtk' __disable_in__ = 'unity,win32' import gtk import os.path class gPodderExtension: def __init__(self, container): self.container = container self.status_icon = None self.gpodder = None def on_load(self): path = os.path.join(os.path.dirname(__file__), '..', '..', 'icons') icon_path = os.path.abspath(path) theme = gtk.icon_theme_get_default() theme.append_search_path(icon_path) if theme.has_icon('gpodder'): self.status_icon = gtk.status_icon_new_from_icon_name('gpodder') else: self.status_icon = gtk.status_icon_new_from_icon_name('stock_mic') self.status_icon.connect('activate', self.on_toggle_visible) self.status_icon.set_has_tooltip(True) self.status_icon.set_tooltip_text("gPodder") def on_toggle_visible(self, status_icon): if self.gpodder is None: return visibility = self.gpodder.main_window.get_visible() self.gpodder.main_window.set_visible(not visibility) def on_unload(self): if self.status_icon is not None: self.status_icon.set_visible(False) self.status_icon = None def on_ui_object_available(self, name, ui_object): if name == 'gpodder-gtk': self.gpodder = ui_object gpodder-3.5.2/share/gpodder/extensions/minimize_on_start.py0000644000175000017500000000102012220076757023607 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Minimize gPodder's main window on startup # Thomas Perl ; 2012-07-31 import gpodder _ = gpodder.gettext __title__ = _('Minimize on start') __description__ = _('Minimizes the gPodder window on startup.') __category__ = 'interface' __only_for__ = 'gtk' class gPodderExtension: def __init__(self, container): self.container = container def on_ui_object_available(self, name, ui_object): if name == 'gpodder-gtk': ui_object.main_window.iconify() gpodder-3.5.2/share/gpodder/extensions/normalize_audio.py0000644000175000017500000000611412220076757023247 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # This extension adjusts the volume of audio files to a standard level # Supported file formats are mp3 and ogg # # Requires: normalize-audio, mpg123 # # (c) 2011-11-06 Bernd Schlapsi # Released under the same license terms as gPodder itself. import os import subprocess import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Normalize audio with re-encoding') __description__ = _('Normalize the volume of audio files with normalize-audio') __authors__ = 'Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/NormalizeAudio' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/NormalizeAudio' __category__ = 'post-download' DefaultConfig = { 'context_menu': True, # Show action in the episode list context menu } # a tuple of (extension, command) CONVERT_COMMANDS = { '.ogg': 'normalize-ogg', '.mp3': 'normalize-mp3', } class gPodderExtension: MIME_TYPES = ('audio/mpeg', 'audio/ogg', ) EXT = ('.mp3', '.ogg', ) def __init__(self, container): self.container = container # Dependency check self.container.require_command('normalize-ogg') self.container.require_command('normalize-mp3') self.container.require_command('normalize-audio') def on_load(self): logger.info('Extension "%s" is being loaded.' % __title__) def on_unload(self): logger.info('Extension "%s" is being unloaded.' % __title__) def on_episode_downloaded(self, episode): self._convert_episode(episode) def on_episodes_context_menu(self, episodes): if not self.container.config.context_menu: return None if not any(self._check_source(episode) for episode in episodes): return None return [(self.container.metadata.title, self.convert_episodes)] def _check_source(self, episode): if not episode.file_exists(): return False if episode.mime_type in self.MIME_TYPES: return True if episode.extension() in self.EXT: return True return False def _convert_episode(self, episode): if episode.file_type() != 'audio': return filename = episode.local_filename(create=False) if filename is None: return basename, extension = os.path.splitext(filename) cmd = [CONVERT_COMMANDS.get(extension, 'normalize-audio'), filename] p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() if p.returncode == 0: logger.info('normalize-audio processing successful.') gpodder.user_extensions.on_notification_show(_('File normalized'), episode.title) else: logger.warn('normalize-audio failed: %s / %s', stdout, stderr) def convert_episodes(self, episodes): for episode in episodes: self._convert_episode(episode) gpodder-3.5.2/share/gpodder/extensions/notification-win32.py0000755000175000017500000001002612220076757023514 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Notification implementation for Windows # Sean Munkel; 2012-12-29 __title__ = 'Notification Bubbles for Windows' __description__ = 'Display notification bubbles for different events.' __authors__ = 'Sean Munkel ' __category__ = 'desktop-integration' __mandatory_in__ = 'win32' __only_for__ = 'win32' import functools import os import os.path import gpodder import pywintypes import win32gui import logging logger = logging.getLogger(__name__) IDI_APPLICATION = 32512 WM_TASKBARCREATED = win32gui.RegisterWindowMessage('TaskbarCreated') WM_TRAYMESSAGE = 1044 # based on http://code.activestate.com/recipes/334779/ class NotifyIcon(object): def __init__(self, hwnd): self._hwnd = hwnd self._id = 0 self._flags = win32gui.NIF_MESSAGE | win32gui.NIF_ICON self._callbackmessage = WM_TRAYMESSAGE path = os.path.join(os.path.dirname(__file__), '..', '..', 'icons', 'hicolor', '16x16', 'apps', 'gpodder.ico') icon_path = os.path.abspath(path) try: self._hicon = win32gui.LoadImage(None, icon_path, 1, 0, 0, 0x50) except pywintypes.error as e: logger.warn("Couldn't load gpodder icon for tray") self._hicon = win32gui.LoadIcon(0, IDI_APPLICATION) self._tip = '' self._info = '' self._timeout = 0 self._infotitle = '' self._infoflags = win32gui.NIIF_NONE win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, self.notify_config_data) @property def notify_config_data(self): """ Function to retrieve the NOTIFYICONDATA Structure. """ return (self._hwnd, self._id, self._flags, self._callbackmessage, self._hicon, self._tip, self._info, self._timeout, self._infotitle, self._infoflags) def remove(self): """ Removes the tray icon. """ win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, self.notify_config_data) def set_tooltip(self, tooltip): """ Sets the tray icon tooltip. """ self._flags = self._flags | win32gui.NIF_TIP self._tip = tooltip.encode("mbcs") win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, self.notify_config_data) def show_balloon(self, title, text, timeout=10, icon=win32gui.NIIF_NONE): """ Shows a balloon tooltip from the tray icon. """ self._flags = self._flags | win32gui.NIF_INFO self._infotitle = title.encode("mbcs") self._info = text.encode("mbcs") self._timeout = timeout * 1000 self._infoflags = icon win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, self.notify_config_data) class gPodderExtension(object): def __init__(self, *args): self.notifier = None def on_ui_object_available(self, name, ui_object): def callback(self, window, *args): self.notifier = NotifyIcon(window.window.handle) if name == 'gpodder-gtk': ui_object.main_window.connect('realize', functools.partial(callback, self)) def on_notification_show(self, title, message): if self.notifier is not None: self.notifier.show_balloon(title, message) def on_unload(self): if self.notifier is not None: self.notifier.remove() gpodder-3.5.2/share/gpodder/extensions/notification.py0000644000175000017500000000361412220076757022556 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2011 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Bernd Schlapsi ; 2011-11-20 __title__ = 'Gtk+ Desktop Notifications' __description__ = 'Display notification bubbles for different events.' __category__ = 'desktop-integration' __only_for__ = 'gtk' __mandatory_in__ = 'gtk' __disable_in__ = 'win32' import gpodder import logging logger = logging.getLogger(__name__) try: import pynotify except ImportError: pynotify = None if pynotify is None: class gPodderExtension(object): def __init__(self, container): logger.info('Could not find PyNotify.') else: class gPodderExtension(object): def __init__(self, container): self.container = container def on_load(self): pynotify.init('gPodder') def on_unload(self): pynotify.uninit() def on_notification_show(self, title, message): if not message and not title: return notify = pynotify.Notification(title or '', message or '', gpodder.icon_file) try: notify.show() except: # See http://gpodder.org/bug/966 pass gpodder-3.5.2/share/gpodder/extensions/rename_download.py0000644000175000017500000000375112220076757023230 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Rename files after download based on the episode title # Copyright (c) 2011-04-04 Thomas Perl # Licensed under the same terms as gPodder itself import os import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Rename episodes after download') __description__ = _('Rename episodes to "." on download') __authors__ = 'Bernd Schlapsi , Thomas Perl ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/RenameAfterDownload' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/RenameAfterDownload' __category__ = 'post-download' class gPodderExtension: def __init__(self, container): self.container = container def on_episode_downloaded(self, episode): current_filename = episode.local_filename(create=False) new_filename = self.make_filename(current_filename, episode.title) if new_filename != current_filename: logger.info('Renaming: %s -> %s', current_filename, new_filename) os.rename(current_filename, new_filename) util.rename_episode_file(episode, new_filename) def make_filename(self, current_filename, title): dirname = os.path.dirname(current_filename) filename = os.path.basename(current_filename) basename, ext = os.path.splitext(filename) new_basename = util.sanitize_encoding(title) + ext # On Windows, force ASCII encoding for filenames (bug 1724) new_basename = util.sanitize_filename(new_basename, use_ascii=gpodder.ui.win32) new_filename = os.path.join(dirname, new_basename) if new_filename == current_filename: return current_filename for filename in util.generate_names(new_filename): # Avoid filename collisions if not os.path.exists(filename): return filename gpodder-3.5.2/share/gpodder/extensions/rm_ogg_cover.py0000644000175000017500000000574712220076757022551 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- #### # 01/2011 Bernd Schlapsi # # This script 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. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Dependencies: # * python-mutagen (Mutagen is a Python module to handle audio metadata) # # This extension scripts removes coverart from all downloaded ogg files. # The reason for this script is that my media player (MEIZU SL6) # couldn't handle ogg files with included coverart import os import gpodder import logging logger = logging.getLogger(__name__) from mutagen.oggvorbis import OggVorbis _ = gpodder.gettext __title__ = _('Remove cover art from OGG files') __description__ = _('removes coverart from all downloaded ogg files') __authors__ = 'Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/RemoveOGGCover' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/RemoveOGGCover' __category__ = 'post-download' DefaultConfig = { 'context_menu': True, # Show item in context menu } class gPodderExtension: def __init__(self, container): self.container = container self.config = self.container.config def on_episode_downloaded(self, episode): self.rm_ogg_cover(episode) def on_episodes_context_menu(self, episodes): if not self.config.context_menu: return None if 'audio/ogg' not in [e.mime_type for e in episodes if e.mime_type is not None and e.file_exists()]: return None return [(_('Remove cover art'), self._rm_ogg_covers)] def _rm_ogg_covers(self, episodes): for episode in episodes: self.rm_ogg_cover(episode) def rm_ogg_cover(self, episode): filename = episode.local_filename(create=False) if filename is None: return basename, extension = os.path.splitext(filename) if episode.file_type() != 'audio': return if extension.lower() != '.ogg': return try: ogg = OggVorbis(filename) found = False for key in ogg.keys(): if key.startswith('cover'): found = True ogg.pop(key) if found: logger.info('Removed cover art from OGG file: %s', filename) ogg.save() except Exception, e: logger.warn('Failed to remove OGG cover: %s', e, exc_info=True) gpodder-3.5.2/share/gpodder/extensions/rockbox_convert2mp4.py0000644000175000017500000001234612220076757024004 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Requirements: apt-get install python-kaa-metadata ffmpeg python-dbus # To use, copy it as a Python script into ~/.config/gpodder/extensions/rockbox_mp4_convert.py # See the module "gpodder.extensions" for a description of when each extension # gets called and what the parameters of each extension are. #Based on Rename files after download based on the episode title #And patch in Bug https://bugs.gpodder.org/show_bug.cgi?id=1263 # Copyright (c) 2011-04-06 Guy Sheffer # Copyright (c) 2011-04-04 Thomas Perl # Licensed under the same terms as gPodder itself import kaa.metadata import os import shlex import subprocess import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Convert video files to MP4 for Rockbox') __description__ = _('Converts all videos to a Rockbox-compatible format') __authors__ = 'Guy Sheffer , Thomas Perl , Bernd Schlapsi ' __category__ = 'post-download' DefaultConfig = { 'device_height': 176.0, 'device_width': 224.0, 'ffmpeg_options': '-vcodec mpeg2video -b 500k -ab 192k -ac 2 -ar 44100 -acodec libmp3lame', } ROCKBOX_EXTENSION = "mpg" EXTENTIONS_TO_CONVERT = ['.mp4',"." + ROCKBOX_EXTENSION] FFMPEG_CMD = 'ffmpeg -y -i "%(from)s" -s %(width)sx%(height)s %(options)s "%(to)s"' class gPodderExtension: def __init__(self, container): self.container = container program = shlex.split(FFMPEG_CMD)[0] if not util.find_command(program): raise ImportError("Couldn't find program '%s'" % program) def on_load(self): logger.info('Extension "%s" is being loaded.' % __title__) def on_unload(self): logger.info('Extension "%s" is being unloaded.' % __title__) def on_episode_downloaded(self, episode): current_filename = episode.local_filename(False) converted_filename = self._convert_mp4(episode, current_filename) if converted_filename is not None: util.rename_episode_file(episode, converted_filename) os.remove(current_filename) logger.info('Conversion for %s was successfully' % current_filename) gpodder.user_extensions.on_notification_show(_('File converted'), episode.title) def _get_rockbox_filename(self, origin_filename): if not os.path.exists(origin_filename): logger.info("File '%s' don't exists." % origin_filename) return None dirname = os.path.dirname(origin_filename) filename = os.path.basename(origin_filename) basename, ext = os.path.splitext(filename) if ext not in EXTENTIONS_TO_CONVERT: logger.info("Ignore file with file-extension %s." % ext) return None if filename.endswith(ROCKBOX_EXTENSION): new_filename = "%s-convert.%s" % (basename, ROCKBOX_EXTENSION) else: new_filename = "%s.%s" % (basename, ROCKBOX_EXTENSION) return os.path.join(dirname, new_filename) def _calc_resolution(self, video_width, video_height, device_width, device_height): if video_height is None: return None width_ratio = device_width / video_width height_ratio = device_height / video_height dest_width = device_width dest_height = width_ratio * video_height if dest_height > device_height: dest_width = height_ratio * video_width dest_height = device_height return (int(round(dest_width)), round(int(dest_height))) def _convert_mp4(self, episode, from_file): """Convert MP4 file to rockbox mpg file""" # generate new filename and check if the file already exists to_file = self._get_rockbox_filename(from_file) if to_file is None: return None if os.path.isfile(to_file): return to_file logger.info("Converting: %s", from_file) gpodder.user_extensions.on_notification_show("Converting", episode.title) # calculationg the new screen resolution info = kaa.metadata.parse(from_file) resolution = self._calc_resolution( info.video[0].width, info.video[0].height, self.container.config.device_width, self.container.config.device_height ) if resolution is None: logger.error("Error calculating the new screen resolution") return None convert_command = FFMPEG_CMD % { 'from': from_file, 'to': to_file, 'width': str(resolution[0]), 'height': str(resolution[1]), 'options': self.container.config.ffmpeg_options } # Prior to Python 2.7.3, this module (shlex) did not support Unicode input. convert_command = util.sanitize_encoding(convert_command) process = subprocess.Popen(shlex.split(convert_command), stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode != 0: logger.error(stderr) return None gpodder.user_extensions.on_notification_show("Converting finished", episode.title) return to_file gpodder-3.5.2/share/gpodder/extensions/sonos.py0000644000175000017500000000452012220076757021226 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Extension script to stream podcasts to Sonos speakers # Requirements: gPodder 3.x and the soco module (https://github.com/rahims/SoCo) # (c) 2013-01-19 Stefan Kögl # Released under the same license terms as gPodder itself. from functools import partial import gpodder _ = gpodder.gettext import logging logger = logging.getLogger(__name__) import soco import requests __title__ = _('Stream to Sonos') __description__ = _('Stream podcasts to Sonos speakers') __authors__ = 'Stefan Kögl ' __category__ = 'interface' __only_for__ = 'gtk' SONOS_CAN_PLAY = lambda e: 'audio' in e.file_type() class gPodderExtension: def __init__(self, container): sd = soco.SonosDiscovery() speaker_ips = sd.get_speaker_ips() logger.info('Found Sonos speakers: %s' % ', '.join(speaker_ips)) self.speakers = {} for speaker_ip in speaker_ips: controller = soco.SoCo(speaker_ip) try: info = controller.get_speaker_info() except requests.ConnectionError as ce: # ignore speakers we can't connect to continue name = info.get('zone_name', None) # devices that do not have a name are probably bridges if name: self.speakers[speaker_ip] = name def _stream_to_speaker(self, speaker_ip, episodes): """ Play or enqueue selected episodes """ urls = [episode.url for episode in episodes if SONOS_CAN_PLAY(episode)] logger.info('Streaming to Sonos %s: %s'%(speaker_ip, ', '.join(urls))) controller = soco.SoCo(speaker_ip) # enqueue and play for episode in episodes: controller.add_to_queue(episode.url) episode.playback_mark() controller.play() def on_episodes_context_menu(self, episodes): """ Adds a context menu for each Sonos speaker group """ # Only show context menu if we can play at least one file if not any(SONOS_CAN_PLAY(e) for e in episodes): return [] menu_entries = [] for speaker_ip, name in self.speakers.items(): callback = partial(self._stream_to_speaker, speaker_ip) menu_entries.append('/'.join((_('Stream to Sonos'), name)), callback) return menu_entries gpodder-3.5.2/share/gpodder/extensions/tagging.py0000644000175000017500000002002112220076757021477 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- #### # 01/2011 Bernd Schlapsi # # This script 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. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Dependencies: # * python-mutagen (Mutagen is a Python module to handle audio metadata) # # This extension script adds episode title and podcast title to the audio file # The episode title is written into the title tag # The podcast title is written into the album tag import base64 import datetime import mimetypes import os import gpodder from gpodder import coverart import logging logger = logging.getLogger(__name__) from mutagen import File from mutagen.flac import Picture from mutagen.mp3 import MP3 from mutagen.id3 import ID3, APIC from mutagen.mp4 import MP4Cover _ = gpodder.gettext __title__ = _('Tag downloaded files using Mutagen') __description__ = _('Add episode and podcast titles to MP3/OGG tags') __authors__ = 'Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/Tagging' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/Tagging' __category__ = 'post-download' DefaultConfig = { 'strip_album_from_title': True, 'genre_tag': 'Podcast', 'always_remove_tags': False, 'auto_embed_coverart': False, } class AudioFile(object): def __init__(self, filename, album, title, genre, pubDate, cover): self.filename = filename self.album = album self.title = title self.genre = genre self.pubDate = pubDate self.cover = cover def remove_tags(self): audio = File(self.filename, easy=True) if audio.tags is not None: audio.delete() audio.save() def write_basic_tags(self): audio = File(self.filename, easy=True) if audio.tags is None: audio.add_tags() if self.album is not None: audio.tags['album'] = self.album if self.title is not None: audio.tags['title'] = self.title if self.genre is not None: audio.tags['genre'] = self.genre if self.pubDate is not None: audio.tags['date'] = self.pubDate audio.save() def insert_coverart(self): """ implement the cover art logic in the subclass """ None def get_cover_picture(self, cover): """ Returns mutage Picture class for the cover image Usefull for OGG and FLAC format Picture type = cover image see http://flac.sourceforge.net/documentation_tools_flac.html#encoding_options """ f = file(cover) p = Picture() p.type = 3 p.data = f.read() p.mime = mimetypes.guess_type(cover)[0] f.close() return p class OggFile(AudioFile): def __init__(self, filename, album, title, genre, pubDate, cover): super(OggFile, self).__init__(filename, album, title, genre, pubDate, cover) def insert_coverart(self): audio = File(self.filename, easy=True) p = self.get_cover_picture(self.cover) audio['METADATA_BLOCK_PICTURE'] = base64.b64encode(p.write()) audio.save() class Mp4File(AudioFile): def __init__(self, filename, album, title, genre, pubDate, cover): super(Mp4File, self).__init__(filename, album, title, genre, pubDate, cover) def insert_coverart(self): audio = File(self.filename) if self.cover.endswith('png'): cover_format = MP4Cover.FORMAT_PNG else: cover_format = MP4Cover.FORMAT_JPEG data = open(self.cover, 'rb').read() audio.tags['covr'] = [MP4Cover(data, cover_format)] audio.save() class Mp3File(AudioFile): def __init__(self, filename, album, title, genre, pubDate, cover): super(Mp3File, self).__init__(filename, album, title, genre, pubDate, cover) def insert_coverart(self): audio = MP3(self.filename, ID3=ID3) if audio.tags is None: audio.add_tags() audio.tags.add( APIC( encoding = 3, # 3 is for utf-8 mime = mimetypes.guess_type(self.cover)[0], type = 3, desc = u'Cover', data = open(self.cover).read() ) ) audio.save() class gPodderExtension: def __init__(self, container): self.container = container def on_episode_downloaded(self, episode): info = self.read_episode_info(episode) if info['filename'] is None: return self.write_info2file(info, episode) def get_audio(self, info, episode): audio = None cover = None if self.container.config.auto_embed_coverart: cover = self.get_cover(episode.channel) if info['filename'].endswith('.mp3'): audio = Mp3File(info['filename'], info['album'], info['title'], info['genre'], info['pubDate'], cover) elif info['filename'].endswith('.ogg'): audio = OggFile(info['filename'], info['album'], info['title'], info['genre'], info['pubDate'], cover) elif info['filename'].endswith('.m4a') or info['filename'].endswith('.mp4'): audio = Mp4File(info['filename'], info['album'], info['title'], info['genre'], info['pubDate'], cover) return audio def read_episode_info(self, episode): info = { 'filename': None, 'album': None, 'title': None, 'genre': None, 'pubDate': None } # read filename (incl. file path) from gPodder database info['filename'] = episode.local_filename(create=False, check_only=True) if info['filename'] is None: return # read title+album from gPodder database info['album'] = episode.channel.title title = episode.title if (self.container.config.strip_album_from_title and title and info['album'] and title.startswith(info['album'])): info['title'] = title[len(info['album']):].lstrip() else: info['title'] = title if self.container.config.genre_tag is not None: info['genre'] = self.container.config.genre_tag # convert pubDate to string try: pubDate = datetime.datetime.fromtimestamp(episode.pubDate) info['pubDate'] = pubDate.strftime('%Y-%m-%d %H:%M') except: try: # since version 3 the published date has a new/other name pubDate = datetime.datetime.fromtimestamp(episode.published) info['pubDate'] = pubDate.strftime('%Y-%m-%d %H:%M') except: info['pubDate'] = None return info def write_info2file(self, info, episode): audio = self.get_audio(info, episode) if self.container.config.always_remove_tags: audio.remove_tags() else: audio.write_basic_tags() if self.container.config.auto_embed_coverart: audio.insert_coverart() logger.info(u'tagging.on_episode_downloaded(%s/%s)', episode.channel.title, episode.title) def get_cover(self, podcast): downloader = coverart.CoverDownloader() return downloader.get_cover(podcast.cover_file, podcast.cover_url, podcast.url, podcast.title, None, None, True) gpodder-3.5.2/share/gpodder/extensions/taskbar_progress.py0000755000175000017500000001464512220076757023454 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Windows 7 taskbar progress # Sean Munkel; 2013-01-05 import gpodder _ = gpodder.gettext __title__ = _('Show download progress on the taskbar') __description__ = _('Displays the progress on the Windows taskbar.') __authors__ = 'Sean Munkel ' __category__ = 'desktop-integration' __only_for__ = 'win32' from ctypes import (c_ushort, c_int, c_uint, c_ulong, c_ulonglong, c_wchar_p, alignment, sizeof, Structure, POINTER) from comtypes import IUnknown, GUID, COMMETHOD, wireHWND, client from ctypes import HRESULT from ctypes.wintypes import tagRECT import functools import logging logger = logging.getLogger(__name__) WSTRING = c_wchar_p # values for enumeration 'TBPFLAG' TBPF_NOPROGRESS = 0 TBPF_INDETERMINATE = 1 TBPF_NORMAL = 2 TBPF_ERROR = 4 TBPF_PAUSED = 8 TBPFLAG = c_int # enum # values for enumeration 'TBATFLAG' TBATF_USEMDITHUMBNAIL = 1 TBATF_USEMDILIVEPREVIEW = 2 TBATFLAG = c_int # enum class tagTHUMBBUTTON(Structure): _fields_ = [ ('dwMask', c_ulong), ('iId', c_uint), ('iBitmap', c_uint), ('hIcon', POINTER(IUnknown)), ('szTip', c_ushort * 260), ('dwFlags', c_ulong)] class ITaskbarList(IUnknown): _case_insensitive_ = True _iid_ = GUID('{56FDF342-FD6D-11D0-958A-006097C9A090}') _idlflags_ = [] _methods_ = [ COMMETHOD([], HRESULT, 'HrInit'), COMMETHOD([], HRESULT, 'AddTab', (['in'], c_int, 'hwnd')), COMMETHOD([], HRESULT, 'DeleteTab', (['in'], c_int, 'hwnd')), COMMETHOD([], HRESULT, 'ActivateTab', (['in'], c_int, 'hwnd')), COMMETHOD([], HRESULT, 'SetActivateAlt', (['in'], c_int, 'hwnd'))] class ITaskbarList2(ITaskbarList): _case_insensitive_ = True _iid_ = GUID('{602D4995-B13A-429B-A66E-1935E44F4317}') _idlflags_ = [] _methods_ = [ COMMETHOD([], HRESULT, 'MarkFullscreenWindow', (['in'], c_int, 'hwnd'), (['in'], c_int, 'fFullscreen'))] class ITaskbarList3(ITaskbarList2): _case_insensitive_ = True _iid_ = GUID('{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}') _idlflags_ = [] _methods_ = [ COMMETHOD([], HRESULT, 'SetProgressValue', (['in'], c_int, 'hwnd'), (['in'], c_ulonglong, 'ullCompleted'), (['in'], c_ulonglong, 'ullTotal')), COMMETHOD([], HRESULT, 'SetProgressState', (['in'], c_int, 'hwnd'), (['in'], TBPFLAG, 'tbpFlags')), COMMETHOD([], HRESULT, 'RegisterTab', (['in'], c_int, 'hwndTab'), (['in'], wireHWND, 'hwndMDI')), COMMETHOD([], HRESULT, 'UnregisterTab', (['in'], c_int, 'hwndTab')), COMMETHOD([], HRESULT, 'SetTabOrder', (['in'], c_int, 'hwndTab'), (['in'], c_int, 'hwndInsertBefore')), COMMETHOD([], HRESULT, 'SetTabActive', (['in'], c_int, 'hwndTab'), (['in'], c_int, 'hwndMDI'), (['in'], TBATFLAG, 'tbatFlags')), COMMETHOD([], HRESULT, 'ThumbBarAddButtons', (['in'], c_int, 'hwnd'), (['in'], c_uint, 'cButtons'), (['in'], POINTER(tagTHUMBBUTTON), 'pButton')), COMMETHOD([], HRESULT, 'ThumbBarUpdateButtons', (['in'], c_int, 'hwnd'), (['in'], c_uint, 'cButtons'), (['in'], POINTER(tagTHUMBBUTTON), 'pButton')), COMMETHOD([], HRESULT, 'ThumbBarSetImageList', (['in'], c_int, 'hwnd'), (['in'], POINTER(IUnknown), 'himl')), COMMETHOD([], HRESULT, 'SetOverlayIcon', (['in'], c_int, 'hwnd'), (['in'], POINTER(IUnknown), 'hIcon'), (['in'], WSTRING, 'pszDescription')), COMMETHOD([], HRESULT, 'SetThumbnailTooltip', (['in'], c_int, 'hwnd'), (['in'], WSTRING, 'pszTip')), COMMETHOD([], HRESULT, 'SetThumbnailClip', (['in'], c_int, 'hwnd'), (['in'], POINTER(tagRECT), 'prcClip'))] assert sizeof(tagTHUMBBUTTON) == 540, sizeof(tagTHUMBBUTTON) assert alignment(tagTHUMBBUTTON) == 4, alignment(tagTHUMBBUTTON) # based on http://stackoverflow.com/a/1744503/905256 class gPodderExtension: def __init__(self, container): self.container = container self.window_handle = None self.restart_warning = True def on_load(self): self.taskbar = client.CreateObject( '{56FDF344-FD6D-11d0-958A-006097C9A090}', interface=ITaskbarList3) self.taskbar.HrInit() def on_unload(self): if self.taskbar is not None: self.taskbar.SetProgressState(self.window_handle, TBPF_NOPROGRESS) def on_ui_object_available(self, name, ui_object): def callback(self, window, *args): self.window_handle = window.window.handle if name == 'gpodder-gtk': ui_object.main_window.connect('realize', functools.partial(callback, self)) def on_download_progress(self, progress): if self.window_handle is None: if not self.restart_warning: return logger.warn("No window handle available, a restart max fix this") self.restart_warning = False return if 0 < progress < 1: self.taskbar.SetProgressState(self.window_handle, TBPF_NORMAL) self.taskbar.SetProgressValue(self.window_handle, int(progress * 100), 100) else: self.taskbar.SetProgressState(self.window_handle, TBPF_NOPROGRESS) gpodder-3.5.2/share/gpodder/extensions/ted_subtitles.py0000644000175000017500000000726512220076757022750 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 import os import json import logging import re from datetime import timedelta logger = logging.getLogger(__name__) import gpodder from gpodder import util _ = gpodder.gettext __title__ = _('Subtitle Downloader for TED Talks') __description__ = _('Downloads .srt subtitles for TED Talks Videos') __authors__ = 'Danilo Shiga ' __category__ = 'post-download' __only_for__ = 'gtk, cli, qml' class gPodderExtension(object): """ TED Subtitle Download Extension Downloads ted subtitles """ def __init__(self, container): self.container = container def milli_to_srt(self, time): """Converts milliseconds to srt time format""" srt_time = timedelta(milliseconds=time) srt_time = str(srt_time) if '.' in srt_time: srt_time = srt_time.replace('.', ',')[:11] else: # ',000' required to be a valid srt line srt_time += ',000' return srt_time def ted_to_srt(self, jsonstring, introduration): """Converts the json object to srt format""" jsonobject = json.loads(jsonstring) srtContent = '' for captionIndex, caption in enumerate(jsonobject['captions'], 1): startTime = self.milli_to_srt(introduration + caption['startTime']) endTime = self.milli_to_srt(introduration + caption['startTime'] + caption['duration']) srtContent += ''.join([str(captionIndex), os.linesep, startTime, ' --> ', endTime, os.linesep, caption['content'], os.linesep * 2]) return srtContent def get_data_from_url(self, url): try: response = util.urlopen(url).read() except Exception, e: logger.warn("subtitle url returned error %s", e) return '' return response def get_srt_filename(self, audio_filename): basename, _ = os.path.splitext(audio_filename) return basename + '.srt' def on_episode_downloaded(self, episode): guid_result = re.search(r'talk.ted.com:(\d+)', episode.guid) if guid_result is not None: talkId = int(guid_result.group(1)) else: logger.debug('Not a TED Talk. Ignoring.') return sub_url = 'http://www.ted.com/talks/subtitles/id/%s/lang/eng' % talkId logger.info('subtitle url: %s', sub_url) sub_data = self.get_data_from_url(sub_url) if not sub_data: return logger.info('episode url: %s', episode.link) episode_data = self.get_data_from_url(episode.link) if not episode_data: return INTRO_DEFAULT = 15 try: # intro in the data could be 15 or 15.33 intro = episode_data.split('introDuration%22%3A')[1] \ .split('%2C')[0] or INTRO_DEFAULT intro = int(float(intro)*1000) except ValueError, e: logger.info("Couldn't parse introDuration string: %s", intro) intro = INTRO_DEFAULT * 1000 current_filename = episode.local_filename(create=False) srt_filename = self.get_srt_filename(current_filename) sub = self.ted_to_srt(sub_data, int(intro)) try: with open(srt_filename, 'w+') as srtFile: srtFile.write(sub.encode("utf-8")) except Exception, e: logger.warn("Can't write srt file: %s",e) def on_episode_delete(self, episode, filename): srt_filename = self.get_srt_filename(filename) if os.path.exists(srt_filename): os.remove(srt_filename) gpodder-3.5.2/share/gpodder/extensions/ubuntu_appindicator.py0000644000175000017500000000350612220076757024147 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Ubuntu AppIndicator Icon # Thomas Perl ; 2012-02-24 import gpodder _ = gpodder.gettext __title__ = _('Ubuntu App Indicator') __description__ = _('Show a status indicator in the top bar.') __authors__ = 'Thomas Perl ' __category__ = 'desktop-integration' __only_for__ = 'gtk' __mandatory_in__ = 'unity' __disable_in__ = 'win32' import appindicator import gtk import logging logger = logging.getLogger(__name__) class gPodderExtension: def __init__(self, container): self.container = container self.indicator = None self.gpodder = None def on_load(self): self.indicator = appindicator.Indicator('gpodder', 'gpodder', appindicator.CATEGORY_APPLICATION_STATUS) self.indicator.set_status(appindicator.STATUS_ACTIVE) def _rebuild_menu(self): menu = gtk.Menu() toggle_visible = gtk.CheckMenuItem(_('Show main window')) toggle_visible.set_active(True) def on_toggle_visible(menu_item): if menu_item.get_active(): self.gpodder.main_window.show() else: self.gpodder.main_window.hide() toggle_visible.connect('activate', on_toggle_visible) menu.append(toggle_visible) menu.append(gtk.SeparatorMenuItem()) quit_gpodder = gtk.MenuItem(_('Quit')) def on_quit(menu_item): self.gpodder.on_gPodder_delete_event(self.gpodder.main_window) quit_gpodder.connect('activate', on_quit) menu.append(quit_gpodder) menu.show_all() self.indicator.set_menu(menu) def on_unload(self): self.indicator = None def on_ui_object_available(self, name, ui_object): if name == 'gpodder-gtk': self.gpodder = ui_object self._rebuild_menu() gpodder-3.5.2/share/gpodder/extensions/ubuntu_unity.py0000644000175000017500000000624112220076757022641 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Ubuntu Unity Launcher Integration # Thomas Perl ; 2012-02-06 import gpodder _ = gpodder.gettext __title__ = _('Ubuntu Unity Integration') __description__ = _('Show download progress in the Unity Launcher icon.') __authors__ = 'Thomas Perl ' __category__ = 'desktop-integration' __only_for__ = 'unity' __mandatory_in__ = 'unity' __disable_in__ = 'win32' # FIXME: Due to the fact that we do not yet use the GI-style bindings, we will # have to run this module in its own interpreter and send commands to it using # the subprocess module. Once we use GI-style bindings, we can get rid of all # this and still expose the same "interface' (LauncherEntry and its methods) # to our callers. import os import subprocess import sys import logging if __name__ != '__main__': logger = logging.getLogger(__name__) class gPodderExtension: FILENAME = 'gpodder.desktop' def __init__(self, container): self.container = container self.process = None def on_load(self): logger.info('Starting Ubuntu Unity Integration.') os.environ['PYTHONPATH'] = os.pathsep.join(sys.path) self.process = subprocess.Popen(['python', __file__], stdin=subprocess.PIPE) def on_unload(self): logger.info('Killing process...') self.process.terminate() self.process.wait() logger.info('Process killed.') def on_download_progress(self, progress): try: self.process.stdin.write('progress %f\n' % progress) self.process.stdin.flush() except Exception, e: logger.debug('Ubuntu progress update failed.', exc_info=True) else: from gi.repository import Unity, GObject from gpodder import util import sys class InputReader: def __init__(self, fileobj, launcher): self.fileobj = fileobj self.launcher = launcher def read(self): while True: line = self.fileobj.readline() if not line: break try: command, value = line.strip().split() if command == 'progress': GObject.idle_add(launcher_entry.set_progress, float(value)) except: pass class LauncherEntry: FILENAME = 'gpodder.desktop' def __init__(self): self.launcher = Unity.LauncherEntry.get_for_desktop_id( self.FILENAME) def set_count(self, count): self.launcher.set_property('count', count) self.launcher.set_property('count_visible', count > 0) def set_progress(self, progress): self.launcher.set_property('progress', progress) self.launcher.set_property('progress_visible', 0. <= progress < 1.) GObject.threads_init() loop = GObject.MainLoop() util.run_in_background(loop.run) launcher_entry = LauncherEntry() reader = InputReader(sys.stdin, launcher_entry) reader.read() loop.quit() gpodder-3.5.2/share/gpodder/extensions/update_feeds_on_startup.py0000644000175000017500000000215112220076757024771 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Starts episode update search on startup # # (c) 2012-10-13 Bernd Schlapsi # Released under the same license terms as gPodder itself. import gpodder import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Search for new episodes on startup') __description__ = _('Starts the search for new episodes on startup') __authors__ = 'Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/SearchEpisodeOnStartup' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/SearchEpisodeOnStartup' __category__ = 'interface' __only_for__ = 'gtk' class gPodderExtension: def __init__(self, container): self.container = container self.config = self.container.config self.gpodder = None def on_ui_object_available(self, name, ui_object): if name == 'gpodder-gtk': self.gpodder = ui_object def on_ui_initialized(self, model, update_podcast_callback, download_episode_callback): self.gpodder.update_feed_cache() gpodder-3.5.2/share/gpodder/extensions/video_converter.py0000644000175000017500000001004512220076757023261 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # Convertes video files to avi or mp4 # This requires ffmpeg to be installed. Also works as a context # menu item for already-downloaded files. # # (c) 2011-08-05 Thomas Perl # Released under the same license terms as gPodder itself. import os import subprocess import gpodder from gpodder import util from gpodder import youtube import logging logger = logging.getLogger(__name__) _ = gpodder.gettext __title__ = _('Convert video files') __description__ = _('Transcode video files to avi/mp4/m4v') __authors__ = 'Thomas Perl , Bernd Schlapsi ' __doc__ = 'http://wiki.gpodder.org/wiki/Extensions/VideoConverter' __payment__ = 'https://flattr.com/submit/auto?user_id=BerndSch&url=http://wiki.gpodder.org/wiki/Extensions/VideoConverter' __category__ = 'post-download' DefaultConfig = { 'output_format': 'mp4', # At the moment we support/test only mp4, m4v and avi 'context_menu': True, # Show the conversion option in the context menu } class gPodderExtension: MIME_TYPES = ('video/mp4', 'video/m4v', 'video/x-flv', ) EXT = ('.mp4', '.m4v', '.flv', ) CMD = {'avconv': ['-i', '%(old_file)s', '-codec', 'copy', '%(new_file)s'], 'ffmpeg': ['-i', '%(old_file)s', '-codec', 'copy', '%(new_file)s'] } def __init__(self, container): self.container = container self.config = self.container.config # Dependency checks self.command = self.container.require_any_command(['avconv', 'ffmpeg']) # extract command without extension (.exe on Windows) from command-string command_without_ext = os.path.basename(os.path.splitext(self.command)[0]) self.command_param = self.CMD[command_without_ext] def on_episode_downloaded(self, episode): self._convert_episode(episode) def _get_new_extension(self): ext = self.config.output_format if not ext.startswith('.'): ext = '.' + ext return ext def _check_source(self, episode): if episode.extension() == self._get_new_extension(): return False if episode.mime_type in self.MIME_TYPES: return True # Also check file extension (bug 1770) if episode.extension() in self.EXT: return True return False def on_episodes_context_menu(self, episodes): if not self.config.context_menu: return None if not all(e.was_downloaded(and_exists=True) for e in episodes): return None if not any(self._check_source(episode) for episode in episodes): return None menu_item = _('Convert to %(format)s') % {'format': self.config.output_format} return [(menu_item, self._convert_episodes)] def _convert_episode(self, episode): if not self._check_source(episode): return new_extension = self._get_new_extension() old_filename = episode.local_filename(create=False) filename, old_extension = os.path.splitext(old_filename) new_filename = filename + new_extension cmd = [self.command] + \ [param % {'old_file': old_filename, 'new_file': new_filename} for param in self.command_param] ffmpeg = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = ffmpeg.communicate() if ffmpeg.returncode == 0: util.rename_episode_file(episode, new_filename) os.remove(old_filename) logger.info('Converted video file to %(format)s.' % {'format': self.config.output_format}) gpodder.user_extensions.on_notification_show(_('File converted'), episode.title) else: logger.warn('Error converting video file: %s / %s', stdout, stderr) gpodder.user_extensions.on_notification_show(_('Conversion failed'), episode.title) def _convert_episodes(self, episodes): for episode in episodes: self._convert_episode(episode) gpodder-3.5.2/share/gpodder/images/0000755000175000017500000000000012220346122016542 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/images/button-flattr-grey.png0000644000175000017500000000243212220076757023040 0ustar thpthp00000000000000PNG  IHDRrZsRGBbKGD̿ pHYs  tIME rIDATX͙klTEs.SB#D VAb& (DI4Qb@W B!&؀DEPKAln;{l]:tsf=s20zLaPtw}V*_˯j qΆ{^n(([:6#1uźwΙX\[$co`$BܲJM~އlݦ3?y3L-REEݺi\ Ą1=b϶=,4f""oWT\!jj,mnדdHNA )m(mT{Q-VSF.ؠs?(}i+dJ"_M6Ȥc-8<.` =19B4aL4QDSD"yTY&"ϧ49?<wd;0;s1ưvV22q-M,`skR@@4 89"8C预?1?u lVdoi^BG[:n1<G9`67l ڨ__ο[2>_NKECnj#@< 9)JKhg OTθ>+q.~н4:wOy01J T8@Xx\_㟁2вvK+g! ^&3.(qW4- ǵ~8gd찓R#D3sP\Ƌo496d=T'%4tʇ6o<.: 9@;3mq9 >ı;؇7\9Y>v$O]tZxiwIV ĒCid2+hf9EITd T|N3oN޸b|0\Jz)മ$ klqɜ1ߖ+h_\&z2 TmףbXLGGf' +Y;\UQ\WTY3p*u]I |s!:uC y ?QuV<RxaҺWpx7qJE0jݒOTۿ9lpIENDB`gpodder-3.5.2/share/gpodder/images/button-flattr.png0000644000175000017500000000443612220076757022102 0ustar thpthp00000000000000PNG  IHDRt:tEXtSoftwareAdobe ImageReadyqe<IDATx[ PTG޼faXTPxG)h6nt1qQY;&uv=ZG"kEsxF"AQA9} 0UU=,˂:n>bEhU\ńLa1B]bڜ.[jkk1 zʋDD%MW%NWCM%>OD:nLs9Q]Bv'r &kg5 l>Sg qj.97v:u3Ղ[~*z4/i1fA >$NLe& nb0JynŬktD@JU&Y,r/Qa{aV~;x5ҵlTnDگu]Ň"T[ K6םÒB%5cA癕oҔ&go+! r97'%>Y;kF|\V|,`{8ՖJ0D 3}R>cw'19lʃ~r|naG;몿Q-}Yed_ ½8= B)qxV׀t5de`92`O iiԪʔiZm6ِ}Zˡ+uXPОt]#i]ZIąOB0ی0MA493+o12"yJ?C`b;*k_!:SjzK2b5.9?א^*Ƥ5 S ='^ݶzWt.x̲ۖޢ ?1OoTpZ_F8f2Gnu4AK L &'U۶m[ Q,K9!r Wh ^>"1d&|EmGILMM...Y6hjGlٲp` ki(燂C\6bF3_\Y,RkUh%18P3bqcD`4![GIENDB`gpodder-3.5.2/share/gpodder/images/button-flattred.png0000644000175000017500000000513712220076757022412 0ustar thpthp00000000000000PNG  IHDRt:tEXtSoftwareAdobe ImageReadyqe< IDATx[ PTG%(#Y4]bXAuSkܨYҘFԺBV@W a9af{of`t-+ U($JOlIVx#ld&v1dªjaJ%>ñ/P9HHȪl$'1.@'[@MCQ -Cs4ȆN:\.W.dro2:eX0w&}.\W[w~/fNy Up0)J7 %ӕ]?rzR`\әᣊqXڋň6AA[ڲw7vE+rX=FPɽ:S&2@ZZ֣͛y1O"'.|9j$U*AZ<-B3Q4{xZvB x@f́Sjjr $X,b;rEн% vvv3r\gDHAH|Cni,+@{hhOr5T5aT5*zj{5ruD 37m w`g/gryP jx$g{2eOѡ׶/JY 8qxpor@vEl (-PӝwN9>CPHDFe+߿)4)ݒ ꗝKJp0g J&%=W(9_C(%c\f$TG^?BmFxFʊ98VY٥ee"TCvY0 `ު?'BsVF CRm˻B4]= *YA^~D 6g6_1B$F%4c>Y1AX֎Ǎ*%tfJM\u?zrǏ:`W^h$ި΀)+L?aM=S6pBu[-}$Z|>2~އ~pbN=Fv%,qfyP5+BkU-y/Į2k=ܜ𤩙Ӽ \dnBd*#B!*vbg &腨M?46ļ5/}(} oևvQ] R߃6:'Bg|^&Q iݛCwzb7ξá)JgȘyhϦ 3r77wxi}X bcv~ӗk}B/x6hcfUzv&T{(. 59[[ve 02xڭypq6cXPF<0,1)q)RwF=wj`Mo⟕+ `A8J Q|5bIfTǡYymxXuBIi?]!Ř& VūUXX\˟;l;)qI?te$1fy].+QwFy:^cn[/O]-&/0&gKI*C:7LwL;4?+ *_,|( \m_G%<xȯn$_:׮kO/V;Y4^p/DǙ2e| 5s_:PӉ6Y/D+*q23#%$$dG3s8>AJHç*:iEx" wHNmSCtT͔c4Z-ȺoW(QZ^SY0W gM%ܹS17kV>itEXtCreation Time2010-02-24XEIDATxip7&EH}ٖ%Ӈ|ٕLbo8]I*50U[IդvɬόI&(vle:,ɒM)$ HTT$~Ex}^(䋻C7@2:hq`Oz:%9_\! Аoe4ʂ!uUధSs1ha;0:j,.O/z:E eQrww?vWhpU۩Dg-NF+L "F%>%1Orwk{76ok7b8&eO0 0 9+%+211(EI1P":F ьI0,*J1^~WoEskVa%cT8<h a"_Nl0-T9멪iF9:v?G闇=u3OژS?͍/^w&el~ 5z^'Q_Slzٟ`4瞚!`s#/X&حNښnaue\מn^tJ_ЧH2\ ?3D54Q-ca^ɫכ?]vVң>1U%zO#XȊžOd\߽f?Jjl&ͣ3wJX* ~Ƹo(9#`' Ia%J/5qs J9k$w`?(.TRKS-ݤ-(oΖMˁ !+yGSh,Qd9>aٹmW_ZMBKS0/MԪq}{3D^rvCdUh`SEoXWi$BaE~F BsᠻCЧ"?ݵ6U'*F _c%A8찺ص" MzStܵ7ЄopXL35q=dWO"F} w;ȰXL25Ѿ-HĆ)VR\$uYDbaҗ"MziD8dJcvD):ba4gHk+3biBKflF2?1D9Ȗ11h$Xp,L RUedR,&yɊLP % ⏍Faŧ騪u :2ECSaTÊ{x()Q#} ("YVXen60[mX[pv= {R#l،.Vʹ 8HHH )0B$Xݵk;0$9qFn, a騷Qok#.0<ȲV:M4Wl"#}ڲgY +F{n+w5qnidE ./ _侶'X[A?[ܸnZٰ\<ɏwka0,l5U7;I$7FVWHk=O87'qmw.hš΀۵&FΏs]`a[}ܹꯨ:K MX enඖGx +\ -p;\b oT[:t:ߋU%boR,;ani}irl`}>,M?X@U߂YsbeGK_J'5Y_zی|NEcsfX*\gK:#!~?6㨴h_Í+ 1H'"\gJ1›pv͒^XǎPwφ(I՜ץ 1|{dk;j(ɻӉ+q\d׭R%?]}w-~"Kz#ƣco-}s]TYV$ErK$X#ʥOI9V/T{57ɺ^PQ[NJGYPa9LJA0Ɋ̙Ì7&yePT:"iR(½<#<NS-.$iΥ:k+ϹпXs[A’VcpoMHRlu9q|H±P\X6‚DJȷ{%(No,Mtk !sR6:_9 UAlzte8,%+2,G]wiZ2EHg|yAKFX ĈD!K 6/:?C K> AqO9珐8rxAuq0<9-%%?b0x(`5@P⏍$aO4BiEk|tUC:ȞʼnD pS9Z$rot8DZx&!ߋυwqYX_uKAVlɱE?+1Ώuc~vqrrłBiH1-cXĢ$Lj'}?"LT)]}P-i\ʲHܿ9(\`1 UPJ&k ;H}ݬ^Vhun ]п3 oh[t멶d<ҿg/OW]X56JѻBAof#Y1f}ms{cySPxlņFr䵨,²Bvw2p/ݾO1Q ^'O}6EUp'#ak ھ޿ͨ7Ӛcn)U<ȗˠj6-;w~ޒ _tK^)(NSņ, SkU[indwc~O֩uXGN/Zz rP}k쯮18ɅTQ"#LqQ+Ơ-y@\X[P[ّ7U_[-PH-b5%pTX: ֳiؔWs9?5JxsI\*#_V CЛX:=" T+u[V&_7:zKT_q˴Z,5-5 ϪPirGTU- FXjקj9ᏍY*qfqr9=GOmJ@l\z8TX![H?U6TsK"Zb *,b.YvAޘrQW83W@3UxrPZVc8RR/696U52שWea vUGt&>,+223APCsꫝ4D:1U=YXj/n(iX:|`[VO a/jfsCSYGsdkn+vύ͕lTuѐ[74ש9ףaB?9x=ʼndS+u9E{D1uZxd%&Cj<> pza B0זb)XEY=?!Wn ~ zXI6aɇeNrmT>#dH_:^&9$Ed0 xOR<'bQcqFzX/Jž =O0j،TX{TY`^,"#pnQ/M|XG:/l_nĩjlWT` ݾtN91+T1@LQdkCg] Spfb2Kqzܨ( .q=0J<6%.O{{-4lM3=05X(aMX3t+ !F33Z,`h!`’L ٙ̚ ]3I@|Y}e j'/vpX7үs83x{5ٍo|] =pJ]9)X*G6sy(QzJ*edGNI&%/NǏt:֮-cmӎ>|))/׫w{7Uni,}*+).7ث0y? Le:ͩ33JovŠ/  lrgGt~5%ZJ)%ɯӧVXWZk5:tlmۏ2b"'/d}28Q^}%kje}s,(:tlhM++/32x4ay:%~z:Nf 76[ Fv ׏~/ӌ'5.ww"Дq>͍rg=GT^U{qX+3 \ooHbx=3R$ _KT0`[|1W_?s;AB|~=k>?㙭)ٺtL %mAsm[]́dZ2'.';C \GSt^Ƃ! <YEm}%:)P2c^F&#? ?ᅾcQpw:a)@#J5ʍK$^Lw~.E +C0w@'%iC$¨^KJ!聛{V XY 4 8ɟ=$&cVTONIENDB`gpodder-3.5.2/share/gpodder/images/podcast-1.png0000644000175000017500000001564312220076757021072 0ustar thpthp00000000000000PNG  IHDR<qsBIT|d pHYs33OtEXtSoftwarewww.inkscape.org<tEXtTitlegPodder podcast cover artKS$tEXtAuthorThomas Perl >itEXtCreation Time2010-02-24XEIDATx[pיsId&c 1ܒ& DzffV)yCv_6zRI,;k@12qf4އ3=H33#US=a:|wM(A bh/+.2?ZP: _ 2ѩib :A~ ,/RC#i eZOov[uqѵhS-hƘ,etz*|SޘjSV 瀎ޗDڛh_n7 j[lʈ(,D> V'bu۩iSaub%`Z6._NM}=:N?MաRC!Ɔ9ǁO>r8<ѭ'=n(A {ewŻ QIl5fl`O䵏?f87rשi'+cRaeD&ν}rٸ`K O`S($.‘#g|[vL& #DoYÎ0aC4M#)$I} WUTUle6":prp`ͣG͉U`Db2̩.y3׮Teb(r"W#. .x?p a"d[' 8Aϑ#*IަMQR)$ۢhHT]vzi'5#*Ϥ5kkڂT,e5\':իĢѼky쮻td3θ2侹}ro؀++%<:Jxtf99w ؾ`'9Qr,^/ܰ-TfT%w={FVfCǹw=t[Z+DlQAbX}^k+\i-X;Pnek{;3N(fEWt|lhͽm9ƅ7ݝ+VPܜW}9ikn¹^1UIYlYޞ_*$Qhַc$q9faͭ_19@m}ӧ=bk64Ж Ԅ.a963A :ڛ= sGSSޤ=L}66苸s$, TQ.6vOxKMĞ tOC\#Ɲ"cպ݈PaлiF4YFK&Wkj$ 53cgp:uv,Wvk%KZWuvbia x*=(IԸ\n=&t*W/"I81~[Z424DEΑG 0FguG/M@UI9sH;G^dT3BX"RK RK ͛AQH_ T Hli"En݊::|rw7`[7'2 xle ˗{zH:joMY)\ff;w:{do='Y/qD8W@K$H>wߵ{1;AxH?NToMiIa#Ix֯dznSgW+ݪYVQĽz5vg/VU3[XnumΞ%zʵknՌdHhl'Ŀk!67֍EKЦf28j$R By8,d_Bs}7Rk+c/8;$ T&CK$H@B[GanU?;^xTa뙋^  Q2b$? 55nou睈ѸEp}1"/S攎BSgH =xҥWurA`^DѣnMdE5-q4ٳΞEp:q\g$Cˊ vB#gHxl+tu /T0G 9byO_Xg'1+VP`SU(*#ʢ\Fгϒ`Bc!Tq|:2Rrn9%,+WD~{ԱAZW7D6e"0 \+WؽN6MВIb23Ξ-{Ʒm['cN0tك[e^J828:4dZ[ _ Ͻ~(ǻu+j$BV'=A o~z+WtDW$Z1~X(|5%>MQaVձ,ĺ:ĺ:˖ٸQOyg/\(+Jz`г߽w{{YDٻp,F94X 5EX!HHxlAKH),Ei$ٳ|ZQzٷ/~antZ7zi;#WχgzOK #}eu"-^K_2<-He4Ha⨯Cnl/I}%n݊sɒ IQGFa9g;/o6D:To7Z 7TҖae<[nQUtuzkj3g4YF3VY',ۍoNO>sRˏh9jnBw)eAЇ*?mN @o֭8ior 3"8xmao"欰E|۶n†@Ae¿y|i e`n +|ǔ,}M\Asi[XV]ڒJӟs"6B뱅QOXrYw!gSYUu1DPwFKhX*']JkX%?|x5A9ùbJ KE?G*5aogӴ*quݸW few D"?)١C55q#+W꫞ s ~?W{T_Ç9QVPf/ݿߴ2͢jX> _3Xg'ɓhX$~Y5Mr ĝڻukmʡjL<}K/1oW7ǂ O􈣑x-"⋖O**egtuUJib{N~C:;  9: +ӧ-۶ ,| +!ww3Y_j扉M ލK:S$Fֆ8` #VF}e`4}JaZAY]eV MCbgؿɆ5uux'QKn[XŢ2З0ȈnCzU7L^Jk&~K8,(aUd(-\XGXơ*+HD87qJ(dbtmj6 }ߍ; [@1&|۷[R ڵE<4E!?ت_u *SaiZw4=䮇 ˵r%~$aRc#46jk?ȫ裒뎾eL̻-ùdIQYo+V9U>~?GޤiBO'N׊9",'=!Krd]p0~pçO#EIa2{HKH8r }е SRrȅ y]uȵdSYsSh#/x2Z+|O;u!C[kmmA̯G/^䥓'ޕCt 9w{[}}:q"0>XaϹf1$qK[~Cktp?8[svDy7tj@g绻ɛokjXj ,MiS^AȂ;ȳCf\/!>00D3r6yڕdȵk$FGI[t8\. F K-jCPiT,326Fի pfh8ʥ[D}"$, pӓݒDMmoU1&˄e9۩޸%,]%?l3C{sBt 7-U\AwMK `1 d~֗\ ;\G&~7WVW>xIENDB`gpodder-3.5.2/share/gpodder/images/podcast-2.png0000644000175000017500000001611212220076757021063 0ustar thpthp00000000000000PNG  IHDR<qsBIT|d pHYs33OtEXtSoftwarewww.inkscape.org<tEXtTitlegPodder podcast cover artKS$tEXtAuthorThomas Perl >itEXtCreation Time2010-02-24XEHIDATxYs[睧ApE$%J"YdIMgq\]LLE.r|LUOMWRSǕJZeǑ)G-Y)R\׳ IATsE.gtw;j M2b&4?׾|;VaEIO%">w- \L6,Ȋha+3Ʉ, Afcn< .+\`bn$҆?TKf3 Ex0@$ka1Lv4b ,E6-b aU⥫Kh%ΝsFV%FE htfCXD״]K0L>:B_ V1VG=F馭`kN~xz7ZO6&#hZ~VXE .f|o%jd@4ڱO-2"`. XD36iCvn q SN?NC t簉x6ٽU%ʢ([KW*E&Ca&Canwo~ b|0jE%oQTUJh%Nh%N-E_EwS&CQU詊4dDg)FM73 s=Fg:ُEl|'v}""D7ٹl{Ǩ(Ջ i>zVvʹ\{] JM}*"0cN-l5-^<ҵy:yQ‚'A.#VC]ͼzh $39Rmzp]WgɕW'OfrDj쎯 3Ё':1q:F:+16T{7|4*,(o-N)Kḟ̯Lq%#Iοr~7wJ rs߾ycWQUz}܍^ʾVbUR "+wMzY=1U uީM ߍt u t}1UiSx]5& l?Թ((EQ_:)sqStbPpx*06Yx /RSQQeSAYNuzgW-wZDMi`Yp;t<47Pk(}|8d5Y?'7ljA=-|36א;ս/I29I.+JxBW/&3"yqղ .y8poA3lMуc29,s3x>׾͇d8n'jNv"D,)kZ}a6xODޙ:i>}_e:^%CǒY}vYPRXB7ǸqlXsq-͋I!MIs$酨n^=ԾSJ^XETcn?jK+^!jn"%+kBWߟ%2qFaQ%#?1ԉN$+29" T>eC],ѭ\ZvHG-垂9_=')D bl"J= Kj?7y4nZadn=G3$YQp;ڭ" ?<=ȏ֤Ӻ,UW;4Ok^ٽcAUXMn;? xhd@=c)jhG0hۡM@&,OdyOS;׏f53}ՙi_۴3e~xzQc '|@u.X233EX됐q8w|kIqglNr@]5E-i[Bî~Gp~I]5yS|\TuY0yVY [L\ۧ!2Z6tV IʅAWaM&z:?)8+|qlTUUi2ܧmS #ִFfc+2)o0C_*{&2ۊ ]-zk=sjr/ !mS; k)m&jRs;*,wxZx j[=uV%3nk*,{hg5hWd}|U%,]kUZU|on._*Z,n^ڸBgU;E4^HԻ6šY_0V=BTRCAZSsD:ǢΛC>IpIVFTQݺtN0pĪQ{,~Cc,5 +jXOXݔn?GѸbBcaUcc.sLԵr]4iͯ{glNI ZjeeŷC$xϴƦ>󵶿UNѺj=Yu]*|xh­3*YWy ;?*oo;h.j{,]bհ# Qvۼ.sB3<ө%H8lz4^Jy>|Dׁa]MBHs$9IW}[G3eU[Ԣ):vv{H.VhJ2 3Q%e}(k*ti8T Uk3םL$Pu4>P>ID2QZ6ƠD<$,bC E,$HD"^?kf?e3R(6NCig*tlla0ScD#adp;k 0m/9I"[w7kJLMO/A&Acv&d57#c+.`u'G1>lv VbLMTfvh5#}bmZYQW*{pUOGeIVܠi X' Ke)sD&Fwn|qBy@KSf/TU%W+~ /,WwBA|}B&ޮ^1$7A|32wob!T=%"9ץ-})2Sj`0a Vˋ:,37gV6uAKe?D+_+߿w ݋"nNEer9J?&!DXQUi˛׾߿ X^Jt3s1ڳح6zʃ1 !n^/*OUAC@EtCdb c?)/Lf8;HgkaC@gkCerd{~O><aNҾd2og9B4#J궣>0t8=4Ns!޻_* ߐL5?VDK~[ߦ J<˲L*"'I9I.l (b-XDͱᨣ( Siy˟|\)ytdbtu| M\;?:f9ǿ7E&Fw‚Uq%=υwghi*4؝J,gn!ȝnpO+Wq#Q&‚aO\wp #u{܆)b!+2Dh<cs㋫"?[o+eSaG bh(=p8(``>%Y"J051LMWΣJY/[V_o76kkp=8] ';($ XeF&oi 0 vOɻ~_j V_h0+EvZXGYt݅2Лe3)7 1z5@*O^IENDB`gpodder-3.5.2/share/gpodder/images/podcast-3.png0000644000175000017500000001630612220076757021071 0ustar thpthp00000000000000PNG  IHDR<qsBIT|d pHYs33OtEXtSoftwarewww.inkscape.org<tEXtTitlegPodder podcast cover artKS$tEXtAuthorThomas Perl >itEXtCreation Time2010-02-24XEIDATxYS[ٹ̌cvqSuN͹ɷE.sosT'UOJ:m=a3#&1H 4齐%%a^{ YóYEQ(!#pG_7тu`<_wF#r@ې | |4` pk40"Sɡ56d>~ sS#C Ph ܯbpPkc4&X/z;n."u$b>N8\nL E߹ysG{ݖl'GT&~K޽q/߈.I6א咍:$ 7`2ohn>@Q?\Iko;UIo28|es/ ze sHLx~Û}6XKCx[[jIO&EQS$p(6޿. ^򻌆sr,myWomn\Nu( 67^o?u>?x\yfArC#lo(6ԍi3v ?NUJ$FZ:;qzafc$gC_KPdŹ}>u el(kldEE{Hki[X0͝yRڰy I%l̷ 'ywpƌ'WM&}=p׽˒DhuEӆT?2JΈqdwYdmȘvjmؘgY@{[ "HddW@Wk{n&ઑ;6=;lV[;6!u)т iGoϟIoN˵\e-sԈnE& H:aÉj~.JgYnfYXH:HkjW@ lj`Xs鱜fk^Dmv !RڍF̏ "DD,D11[,839qv; I*^Xz $ߊĈEҏc)}O(7LsTd4aw=18<ǎ@l3Fd}p0JIDa$֑,xWĹg+UrUVxS'6zi_{"2hBG4bQo9ETq짭oZo$o+- +vݦj݁sL0jN7%#QSH 1UõzaeihdWhiٿ!{>+mbF !ynaAvr/glUo8h\׹?B*$Uձ/JXYz:* cwkSX$3%jjk"/2Ͼ}B4]j䅞̰' m+z$?T^(EEƎF5֪vX +ٟpP!K_*T@+,Ȳ{j]KjK7Iln0dzEAddY;]9mʡ]Rya}1Kh8W=Bc9i2{a"B1²:^-W#c\Jk7zϰ8JE}Cm8.Su7L3r"^'M'5ql[$Xe"U2d+Mw_>,N.=P]l7|:Jbszo0ZZ_^#SJ?%~rt:'>ޢB'V ?0jCs^9TťC *dH*hxȚGy*;Pֻ:Nz _\/ԭPʼn؍&L|ndӠ^Cݻ\7;\vRZ8 "S?|YfMy>,O/H#Vl1s&k)K˩6[qW>U;(e>FU˙gKcbtBuV)~QkXWyw84 Oji+^x5`(z#XmaMFM{_o3p `eIQ?zjq@A bTXKS"3*{xSM|!,-<:CSa*=:eeVT9jeE[a| Ζ. Gbn=j*rfUJXcl WdEuC[%,R~ҽ\EaU&Q;mSY K7+J=AY"-bQ, ku|>׫uGk *v{7%cj_$JSPaU1 h37@!j{($ ]Xb\X/DF<cNea(f~#|\^/tͅ( o?rWy'rb7*kfW.c#'|4*LE;Sێb(̓)MVx/U/ʑŞ檶ϿFt3ʙ+gъ«1MV* uw.J=P*۝2>a#JJ6!jDn2H/TCaEV7V7Է5r=7k%Ad5A D JEϱT raeY X`4C 9Xڦ꫾0~jQE& S5D^Ԕ{Q !6W7,^U < eeT s4Qlqo=u%_(m[(/,:O&EAy#N.%H&ye|:G\a  `+|m k0ySzXyI;\|@kՙ`]WmBdc+Y#U+/''\taC6Cq.WF9ƒ9Vr\6>}uܱ;Tphkc _JīIB+U 'ګ@kё&W.׻KQ8BJ@H2mb uŀbb`Z{ ccܽ?—_*U UXmCL. {p択,b`ns$h`ݮSX-&ܸzގ__VG}$*Ks~ b魾??¡em>>HX&Fp+wXV.mCF*3hZ390Og?I;ggI{+1jIENDB`gpodder-3.5.2/share/gpodder/images/podcast-4.png0000644000175000017500000001521112220076757021064 0ustar thpthp00000000000000PNG  IHDR<qsBIT|d pHYs33OtEXtSoftwarewww.inkscape.org<tEXtTitlegPodder podcast cover artKS$tEXtAuthorThomas Perl >itEXtCreation Time2010-02-24XEIDATx[l\y>{fH)J(YeE׷ĵcV۲juܜNFZ@})>E Fsr䤱Ml$uhvkRK%~sݳ^ <1<"K+հFsY~ \its+)}S^oS^*[G髕uUa*m +ˮ[Uˬ$t=/qrGpBۗ/ ȱ/+~XϷ]?k ϛ÷.ҐܿVm{JQ5q>'y~ϛCŐ)!NT-it}sēz;]K UQ7Ҍ7~vKM=wR=V/R,LQtU +[N 5a6Qj` :86 N̢0CIQBu e+ώ=7H b]hX ?4 o ҂kȰshz67Ѝ{9cjI18tCJVcil^u43!AFa)€ڔ"V%l:nRX -+!a%ĂgᚹE1QE*RHYȄ @²2CO5֐""D M~f Rzq6/!FbUQT,4XFyMq\$t*Pt+ۙR8sx3xY7&,GW k)BO]b(9gggL[PX(a›í-E$g;ƺV3ދ +{{|>Ry'!B6ьmh6RsUфXºnFvp+P-NtaM":þ þ 9S%~|[|ªC[{p 9';ݤ æ<w+$FH6PA![G0% DXK꽤'3xxɭIu4c}HXHߌ' һ$IzUϒ|Z9&'QA2[;`!VK>@vh掕o tr#Z@z |+N7-H#lxWQ-T܎nB3wI!NuaD]jǒ݋To 1fB7w;A5;ew;)Mc_H!9**Ra-F8BþߕCf?)M=_@Tu׉`̽nDOf˗(N=NIQ1ʻ[sN9'(zj}umel"~B B"Yn(;.n=SP{ >?E »)%Ÿ\U(ϼHa|jmq}E#Ww!W iP +y2s)N[+{WЈN0I8Hc)8ZfX;ajNSEdSǨ=V3R8W(L|9rz>ѱaQJgclBa#JSFٙR}}Bاfb?i5W9A~)=6A)*g˰j~UpkQH?=i^->F(N~/6#)m]+ WkݲZ5wCVjR.{1w!";c'M"PQATc!RTxWY6o*_U`l>eHn({1z(Rz&s78CX=w_Ys^)ڰmu!z53s+›-Zz7F)M= B_`+vUܯumnPV=l{TQ*'(N=Ӷ;NJ_l]jka-蘙n{Uz>\XʯGع˾/Mj=o!y#}3٭_=K&,Іnl޳30Kt~.KXuGnF>/~⸗F3!r[ +, _|ON 3mR#-KGzWΰZOin âKUašG#;e5 p(M?Da*ͦ0vE6~s"XRPWPH?6UH-#3Moz (Jź9x6 u|þ1J3?bURx,zRPT&M-,;w(mXiAPkGU}o`HU$OERS%|ęxi9-'03w`!J'[s^n2 \wOcz7c7xE1V'p Ʌ7 gckn[LyyʳUMhYT5Q,3Uٌ5[Xn.$ [9N%2{cigSTЍqǒ~aYn!j}詽5#`ѬksR3Y+bZJyeP175}3}j#/UOToR-%[{0R{ѭ` CR~?n#RPWz9J !DX!p=>[> n°`Q{mT ?V;I%rR7Men 3 =r"[WsNQ1ʼn9#._ٖ-F{3}kKU9*1zR=ñ -:|wԳ&^ WH<Et pz4ckz J3χ5]An5W=Kq@xӋHY'ިYHkCQt2[<-ōi^k +TKfSN zբ[sR!c2hoBӷD^nX:+, HE1&1D50:E7໓o "Rp1w-Ӿ9t~ߛ),Bܭn`~]|osk#[ο/ӴE㣤sc!BzKBP{ +/E0<g6GYMd50Jڱb{N-|XhHAi{@[EM$t~)ei E"sju7Z :A|Yڋa5T3; ',9I?⻗c';z(Q-q@OCQӑV6 OVdˑE튐VXKJc܋+9w"nv `C q& x\ ߙ#ꅌn -‚+! 0LBp_3¹ $n[^kS X̎To-j[`i*FXrp oRi[>eP\GxK1=5W,[6~9ȉЌQ_;(z4kZv 3 JO/t&uDŽ(:V.mhƶ wp0*J\g23QY-ڨލ^X¯"-std(4ӷл/sWf bGdgr9,*[9JWCDZZhTT}T-Kfm9G;RKT]W 1iUe>x%Y'Xz-U Zuĭ\6a .\-9g#jn{ȣ2oha۰-Xٻ[*0ZsNGS!Wdndp=V1Wn%ZoӰKZ4-J{m1 +۸-AK[ 3ϊEi˔xe܆z]n VD(fXsBhoS<ϊUX^‰|⬇Dk{qQ]nX$݉hal a-n~D[!Q +lOscЎ cW=RHQh+Dst SD}X;R˻E{)4^CPإE;іRuqWPɿAz̽i M[!Ȯomd]X/v%k?؞QaNyEk-5U~[~s )[OWj\*Z'Tx'\M\BB(ͳЄRLͿ2R4"򥒢Bx y)g=VnQX͚wT`vZo -S(t,-K 9᪞ J"+d;fa :["a@!}3^,FmqǨ,rU5=VD1OU5wg~HwN:ux7Mqaj(Z <Ÿ |˿|"^ ѭd!. ݁I))T]p^B&?\%OU^5A܂pR~X t(',BmZ2un9 417I 5acagc^dϫB_V@:K#v1w|GW)?g U5͇iA#?R40<"ż'~Ni $szB%xΩa+ R_P_E(AnKk%_r5Ŵ)b l kxDS\:T' 7k$=fMG2˦^Ræ`!@Y:l=Q;C*BENN5<"%So-:bo$aTr[>h&ϩcbܢH_i"tG_`IZ ]Ef#\8bskY`M'N[wj(IOnLKG):W^BTٛPŗC Qk=z0^@%N.Y]H-),Qe а%>6'R>ɇo Sn~cK\VX SsVkn4CF0kZk{BWV/qQ.= ,X6mgy}UȄG%*SL}'~l-K (,Q% < |iBTtzeg0zFQ !ېH"2ZgϘyT=OO [UV*^ tF3ڭ ]nZn\7T ˱&a* p]n8VߑzjXU (7ܨ^[+Uبww&,ysߧ _Ee DIENDB`gpodder-3.5.2/share/gpodder/images/podcast-all.png0000644000175000017500000001431712220076757021477 0ustar thpthp00000000000000PNG  IHDR<qsBIT|d pHYs334MtEXtSoftwarewww.inkscape.org<tEXtTitlegPodder podcast cover artKS$tEXtAuthorThomas Perl >itEXtCreation Time2010-02-24XEIDATx{sFǿcŗPv$O;Lo//6yiI1B0`Uó*q-iD~xbٳgϞeLv <   z=ߟ+ HQ!P ib:-![F40>f+t/^֨o$I>! +BaB(_ B|!V/ PX! +BaB(_ B|7a1 Q|`8,ϻc- a&f('CW3|X,X,Buzl6d2ii盰  i t:v~78qF>idYF߇,0 c-\/ aJJCL&t]t:Ȳr米3fM7ol\Xw$ 888it:h4[kc3:gc'yx|VZEQ6ݬC:SP@DzKhaS,l6Q׷CeK`777nleYT*h oY+'ÇFx=ᦛ䙭 p/=6߈xNNNlgAe+EEx8ts|#Jlj6EH(~{$E\.^Zk CQ beqtth4fko2M~yl\lv/ oׯ;(44bҝT*A$T@&6kvvmurr/QTx1))ZxG:bX1iR6Y!n~Jt>D2|-aprrD"wWo˲( hggg`0Hŋxb*NahZx%ZB8`wwׇ.G Et:q~~SNfSAFu/_;08<<\Ⱥo">NC,G 7>/X݈bc.ιix硍a<|6dc<'O|c6Yi2^:rndYƳg u[2F=}2 ŢiuX ^sEQcBuo޼ _V8HIP(`ҤȲϟٳg>~h 0y<#T*a6YpjuM& 2F8::BRYGYX,"??~LeE_m8γ[("[\J,nt 3 bǮS0_=(>}"r'O ɸ><͛7,mTO`E  ?kh$FiHٙNUU{ΓF',`]V+k#-ĕprrR<0pqqA=,.!Hox^#dGGG+hj`{{{8::rЪRP\R[䫯rզiטL&Tr *fY<~q?x<%5W4&,00icY=s4MëWcc)!EYIH$9n?~^<$,-iOoeŬ x|zX,jJ=,.m*+NۦB6 h4d2IQZש'E;sZbZd ơw Y]L&f,,*`M~deP$j4Z~`9Id2\.wdYi\.ipX,OYh4lţ( .//WRɶ,ˮQvn]ټl.-V,w}%q?Gl_oj{٥(^¢rvWǏ?8C6ӧOg$ Qmivái+)竰'O\MTrmfmaghz'˲f^?iQ#4ifv᫏E>&NXd)&H38vz2 ̲R~G㫰jfI/3!,Rԃ4h4\iXɎkϿ'9ve^[-,UU[כ47҈n7nS _fzvH [-,~yo4xu eYZW*4{;; `9a)be9/ֲV8sb1$Ip_v#WWW`-nv!Ib5YNڎ4M(dB%?K x<^LdBNs~Wu4@9NQ4dq d25&r(<)֖A^ %xԪM(!ώPX,܍o ,D $s996ֆ! AC-obYLJ(4MDǣeㅬ(` 0,NMӶ!ڇ۽\b4a4-h4MӴN\U40$0> V ǍlC@p]-|D"D"ikx2l,.<,"L"LZdv@#aX;mG LB4}OuL 50d2Vڍdh,tx\~CWME`Y;;;Hv+Lq5Muǭ@RQQ"FXdv=b%H$BdY.pu"bl6fMRR慴iH ૰E`YַjQZ-;e :[D t7an]qV W#eY S̍v+$$Bq/"JDDP,q}}q-C!Y¸fDQq`EfDg`aF!IR9CP@ thb>t:t:EӁ bHRYH,n_^^Wz DH$-ɲe6.yHRC2Ύ;/7Dp||F⋠( E,HR ,JAۚa7~W&2 g_8e\^^R\役`0In%.o$i;;;-aRfX]0J\kEEd2[5 bjMIz:zڛN~oڎ _T8 WTYUUt:HOc<K^c]H``@hZRl6KݖH$}B^qZ!yX.d?"yr2Elly'I8J)Uih6N(JԽ:JYȺ8g%EBPU0L.Ǐ7t(<=z]8OCVtN bs X àqO`Y\Uvl, NOO|x O` "<-e&D"D"y<@ZƒZ'''?aww`$;Ȋ]DQRe;H$Ai|x<`֌صH]qssFw-2/Il4 T"f6AeZ-\__/:dG1 F},MߞMw.U5~2NGt:O]wegyɞKbBsQf3\]]෣X,jLӤ^f'L&Z-O!#zb EejF1 q=+qUXhQEAEea:[L4u{p~`YvmYp{uj6ejz"X{t2Pq?\ Es|MӨeC/H׼27H-Z,e=t0fa&/,]שwvTq%,߄E*x W'ީ7p=JIEq{ ͪSi 7˴uY/)xLhSi|ѭVMӨwlhSV vuh0e- ullRl&dER R ;q|+GqfIgZFXxCUUt]G1 ˈ#}I"d2HӈF8 vS.0,iYd-HRD":vw:b8zJur.#,zV2X$ps8}ZuַhH!5ZfGR]l+6Rmf:UÙکluekymF}`BPX! +BaB(_ B|!V/ PX! +BaB(_ i3$᧟~Zg[B }bYvGfl7P X ]-nφp( PX!l6z}YIENDB`gpodder-3.5.2/share/gpodder/ui/0000755000175000017500000000000012220346122015712 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/gtk/0000755000175000017500000000000012220346122016477 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/gtk/gpodder.ui0000644000175000017500000014176012220076757020511 0ustar thpthp00000000000000 10240 0.5 0 0.5 0 50 1 0 1 0 menuPodcasts _Podcasts gtk-refresh itemUpdate Check for new episodes gtk-goto-bottom itemDownloadAllNew Download new episodes gtk-delete itemRemoveOldEpisodes Delete episodes gtk-preferences itemPreferences Preferences gtk-quit itemQuit Quit menuSubscriptions _Subscriptions gtk-find itemFind Discover new podcasts gtk-add itemAddChannel Add podcast via URL gtk-edit itemEditChannel Podcast settings gtk-remove itemRemoveChannel Unsubscribe gtk-remove Remove podcasts gtk-refresh itemUpdateChannel Update podcast gtk-open item_import_from_file Import from OPML file gtk-save-as itemExportChannels Export to OPML file Go to gpodder.net menuChannels _Episodes gtk-media-play itemPlaySelected Play gtk-open itemOpenSelected Open gtk-goto-bottom itemDownloadSelected Download gtk-stop item_cancel_download Cancel gtk-delete itemDeleteSelected Delete gtk-apply item_toggle_played Toggle new status gtk-dialog-authentication item_toggle_lock Change delete lock gtk-info item_episode_details Episode details menuExtras E_xtras gtk-refresh item_sync Sync to device menuView _View True "All episodes" in podcast list True Use sections for podcast list True itemShowToolbar Toolbar True itemShowDescription Episode descriptions item_view_episodes_all All episodes True item_view_episodes_all item_view_episodes_undeleted Hide deleted episodes item_view_episodes_all item_view_episodes_downloaded Downloaded episodes item_view_episodes_all item_view_episodes_unplayed Unplayed episodes False item_view_hide_boring_podcasts Hide podcasts without episodes menuHelp _Help gtk-help wiki User manual item_check_for_updates Software updates gtk-about itemAbout False gPodder GTK_WIN_POS_CENTER False False False False GDK_WINDOW_TYPE_HINT_NORMAL True False True False True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR 0 False False True True True Download True gtk-go-down True True True False False True True gtk-media-play True True True False False True True Cancel True gtk-cancel True True True False False True True True True False False True gtk-preferences True True False False True True True True False False True gtk-quit True True False False True 0 False True 5 True False True True True True GTK_POS_TOP False False 5 True True True False 5 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False True False True False False False 0 True True 6 True gtk-close False True True False Check for new episodes True True 0 True True False 6 0.10000000149 PANGO_ELLIPSIZE_MIDDLE 0 True True True True True gtk-cancel 4 0 False False 0 True True 0 False False False False True 6 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True True True True True False False False False False True True 6 True Filter: False True True gtk-close False True False True False True True Podcasts False False False False -1 False 5 True False 5 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False True False True False False False 0 True True True 10 True 5 Limit rate to True True False True False True True 1 1 adjustment1 False True 0 KiB/s False False True True True 5 Limit downloads to True True False True False True True 1 adjustment2 False False 0 False False False True True Progress False False False False -1 False 0 True True 0 True True gpodder-3.5.2/share/gpodder/ui/gtk/gpodderaddpodcast.ui0000644000175000017500000000772312220076757022540 0ustar thpthp00000000000000 Add a new podcast dialog True 400 GTK_BUTTONBOX_END True gtk-cancel True True gtk-add false True 0 False True GTK_PACK_END 10 True False 5 True URL: 0 False False True True True 0 True True gtk-paste True True 0 False False 0 True True btn_close btn_add gpodder-3.5.2/share/gpodder/ui/gtk/gpodderchannel.ui0000644000175000017500000006320312220076757022035 0ustar thpthp00000000000000 False 10 gPodder Podcast Editor True center-on-parent 500 400 dialog True False 5 True False end gtk-close True True True True True False False True False False 0 False True end 0 True True True False 10 7 4 5 10 True False 0 True end 1 4 1 2 True True False False True True 1 4 True False Section: 1 2 4 5 GTK_FILL True True automatic automatic in True True False word 4 6 7 Disable feed updates (pause subscription) True True False False True True 1 4 2 3 GTK_FILL Synchronize to MP3 player devices True True False False True True 1 4 3 4 GTK_FILL True False True False 4 GTK_FILL GTK_FILL True True True False True False gtk-add 3 4 4 5 GTK_FILL GTK_FILL True False 2 3 4 5 GTK_FILL True False Strategy: 1 2 5 6 GTK_FILL GTK_FILL True False 2 4 5 6 GTK_FILL True False General False True False 10 5 True False 0 <b>HTTP/FTP Authentication</b> True False False 0 True False 2 2 6 6 True False 0 Username: GTK_FILL True False 0 Password: 1 2 GTK_FILL True True False False True True 1 2 True True False False True True 1 2 1 2 False True 1 True False False True 2 True False 0 <b>Locations</b> True False False 3 True False 2 3 6 6 True False 0 Download to: GTK_FILL True True 0 download to label True start 1 3 True False 0 Website: 1 2 GTK_FILL True True 0 website label True end 1 2 1 2 True True True False True False web-browser 2 3 1 2 GTK_FILL False True 4 1 True False Advanced 1 False True True 1 btnOK gpodder-3.5.2/share/gpodder/ui/gtk/gpodderconfigeditor.ui0000644000175000017500000001607412220076757023105 0ustar thpthp00000000000000 True False gPodder Configuration Editor GTK_WIN_POS_CENTER_ON_PARENT True 750 450 False False False GDK_WINDOW_TYPE_HINT_DIALOG True False True False 5 True 5 True False 6 True Search for: False False False False -1 False 0 False False True True True 0 True False 0 True True True True Show All True True 0 False False 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True True False False True False False False 0 True True True GTK_BUTTONBOX_END True True True True gtk-close True True False False False True gpodder-3.5.2/share/gpodder/ui/gtk/gpodderepisodeselector.ui0000644000175000017500000003515012220076757023616 0ustar thpthp00000000000000 False True Select episodes GTK_WIN_POS_CENTER_ON_PARENT True 600 400 False False False GDK_WINDOW_TYPE_HINT_DIALOG True False True False 5 True 5 additional text False False False False 0 -1 False 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False False True False False False 0 True True True False 5 True True True True 0 0 0 0 0 0 True False 2 True gtk-apply 4 0 False False True Select all True False False False -1 False 0 False False 0 False False True True True True 0 0 0 0 0 0 True False 2 True gtk-revert-to-saved 4 0 False False True Select none True False False False -1 False 0 False False 0 False False True False False GTK_JUSTIFY_RIGHT False False 1 -1 False 0 True True 0 False True True False 5 False True Remove True True 0 False False True True gtk-cancel True True 0 False False True True True True True gtk-ok True True 0 False False 0 False True gpodder-3.5.2/share/gpodder/ui/gtk/gpodderflattrsignin.ui0000644000175000017500000000461112220076757023127 0ustar thpthp00000000000000 True False Sign in to Flattr GTK_WIN_POS_CENTER_ON_PARENT True 700 570 False False False GDK_WINDOW_TYPE_HINT_DIALOG True False True 0 0 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT 0 True True True gtk-cancel True 15 False False gpodder-3.5.2/share/gpodder/ui/gtk/gpodderpodcastdirectory.ui0000644000175000017500000004210612220076757024006 0ustar thpthp00000000000000 True False Find new podcasts GTK_WIN_POS_CENTER_ON_PARENT True 600 400 False False False GDK_WINDOW_TYPE_HINT_DIALOG True False 6 True False 6 True GTK_BUTTONBOX_END True True Select All True True True True Select None True True True True True True True gtk-cancel True True True True gtk-add True True 0 False True GTK_PACK_END True True True True GTK_POS_TOP False False True False 5 True False 5 True True 0 True False 0 True True Download True True True 0 False False 0 False True 5 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False False True False False False 0 True True False True True _OPML/Search True False False False -1 False 5 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False False True False False False False True True Top _podcasts True False False False -1 False True False 5 True False 5 True True 0 True False 0 True True True True Search True True 0 False False 0 False True 5 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False False True False False False 0 True True False True True _YouTube True False False False -1 False 0 True True btnSelectAll btnSelectNone btnCancel btnOK gpodder-3.5.2/share/gpodder/ui/gtk/gpodderpreferences.ui0000755000175000017500000011530712220076757022734 0ustar thpthp00000000000000 1000 100 10 10 0 200 360 0 1 1 0 0 30 0 10 1 0 7 True True False GTK_WIN_POS_CENTER_ON_PARENT 260 320 Preferences dialog 2 True 6 True 12 6 True 6 3 3 6 True Audio player: True 0.0 fill Video player: True 0.0 2 1 fill True 1 2 True 2 1 2 1 True gtk-edit True 2 3 fill True gtk-edit True 2 2 3 1 fill True False 0 Preferred video format: 2 3 fill True False 1 2 2 3 False General 12 6 True True True in GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC True False True False True 1 True Extensions 6 6 3 3 6 True Please sign in with Flattr and Support Publishers True True 2 1 fill Sign in True 3 fill 2 Automatically flattr episodes on playback True 4 3 Flattr 1 6 6 3 7 6 True Synchronize subscriptions and episode actions True 2 3 1 Username: True 1.0 3 2 fill Password: True 1.0 4 3 fill Replace list on server with local subscriptions True 6 3 5 Device name: True 1.0 5 4 fill True 3 1 3 2 False True True 4 1 3 3 True 5 1 3 4 gpodder.net 1 12 6 True 6 True Update interval: True 0.0 0.1 False 0 True False bottom True adjustment_update_interval 1 False True False 2 6 True Maximum number of episodes per podcast: True 0.0 False adjustment_episode_limit True False 1 False 3 True False 4 6 True When new episodes are found: True 0.0 False True 1 False 5 Updating 2 12 6 True 6 True Delete played episodes: True 0.0 0.1 False 0 True bottom True adjustment_expiration 1 False Remove played episodes even if unfinished True False 1 Also remove unplayed episodes True False 2 Clean-up 3 True 12 6 True 6 2 6 6 True 1 Device type: right GTK_FILL True 1 2 True 1 Mountpoint: 1 2 GTK_FILL True True False 1 2 1 2 True 1 After syncing an episode: right 5 6 GTK_FILL True 1 2 5 6 Create playlists on device True True False True 2 2 3 True 1 Playlists Folder: 3 4 GTK_FILL True True False 1 2 3 4 Remove episodes deleted on device from gPodder True True False True 0 2 4 5 False 0 Only sync unplayed episodes True True False True False 1 Devices 4 2 5 end 6 True Edit config True gtk-close True True True True 1 False end gpodder-3.5.2/share/gpodder/ui/gtk/gpodderwelcome.ui0000644000175000017500000001241112220076757022053 0ustar thpthp00000000000000 230 340 True Getting started False 2 True 12 12 True 6 1 2 6 True <big>Welcome to gPodder</big> True True 0.0 1.0 0 1 Your podcast list is empty. True 0.0 0.0 1 2 0 1 False 6 True True Choose from a list of example podcasts True True Add a podcast by entering its URL True Restore my subscriptions from gpodder.net True 1 2 5 end 6 True gtk-cancel True True False end gpodder-3.5.2/share/gpodder/ui/qml/0000755000175000017500000000000012220346122016503 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/artwork/0000755000175000017500000000000012220346122020174 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/artwork/audio-downloading.png0000644000175000017500000000106612220076757024327 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME  ^IDATX혱NP\] Kt`21 ư L1&.1a$vb2L, iTh/ܡr闓{=VTo@]aQ lhke&.k kezk( 5ybmieƮ5ڱ w2S51vpG{wr8  a$ZwZ XHI:x 03 =8%<o0s 8ZXb;A藁u)=~u .*k#I|-%uľ`#`c \*krEmɳT| k̀Hʌ@%NR(;64X؋2@(|Ht^ڕ=< pY4[iz#wIC\x2? \@̹IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/audio-playing.png0000644000175000017500000000107112220076757023461 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME GIDATX혯NPE&j@"H!s %}0$5ba5Ef&Vk:+Kh{~9sFLt$QZ@/p}*5z~-CT2Ч5 g\5@?eKÚ݀'p.-W >n,3I,C%0mw8 nyo̤.F{e)Kg6mW.S@B^qWa#bMmwI){дcV5`[v^Ik#\*_g1nM~Kk:)5plQDgzK& 9ZfeF :'Pi<4Ŗ?U!{)1{ *kc{3+xH6p+m׹[Yz#wMCx^+2ֈ5IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/audio.png0000644000175000017500000000102312220076757022015 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME/]IDATX혽NAkO6> jJ*b"THhL(c3$ 0{)vwv˝3[IגN(Xef 0%0p=3El`RMt-Ck cY`RK̿G\`(@ރ$CvH NjR} f*T`k[7poJZ"yH@s+pZ`|Uk9h<3]$odZ z2?ILyzu~mu@G$9 !]>zoHR  S znHrOVT8C7ڋjHp$&y_v뗋8&U55d"١l\,G$LJ7 ,?Ϣe-k=Wz̎urEOr]UFgaQU/:ɫфN|bfgWg4jŮ."y(g0þ湈,]/U}T\ɷEQtC36=k} $T=Ͼ$"'˲r;~MwZ>8 +k=: @#i~ EUoNk#x{c9#$\x v56]s5lrd]X:G    |kL{IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/btn_ffwd.png0000644000175000017500000000116412220076757022513 0ustar thpthp00000000000000PNG  IHDR@@iqsRGBbKGD pHYs B(xtIME ': 7"tEXtCommentCreated with GIMP on a MacwCIDATx횱JAg:+;mB A 4yB;Sy_JΫ-X6Zflv&w_f7 0 0 0 6ͦxn&-m&Ç7%}mW](`rJ{Ջ-܈HlI@;72ɋqy)&x3s,k<"z P@D"i*O1e̬ycb9dSxw"sYdipl9p4s3S"c wT'`/\vsױ 1eުsn?A PG*ѺsY9A^<2 3+ A V},HGcx8*M:M@b^WdI0 0 0 #V>mB IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/directory-examples.png0000644000175000017500000000571712220076757024552 0ustar thpthp00000000000000PNG  IHDRXsRGBbKGD pHYs B(xtIME )qy OIDATxi^URJYHEEX.ĪQ 0 (R bd5@l@vE")XPJY (P;ioL;wϹyI3әoyy,gXOO"Қ (((((((Helma( k]G а!u N/1,v/ `>?aQQ-~ xdb8/?M R,7 (I0W QE~0]|ϵ۰AJ\AJX?,)S+x^Qً;q.oSm*%v5llPS^5v$+6"n!QɆDgDA`uj" R6IV48epo? 7G.n>iId03JMyFr,-WA.#LofK x_A%678eH4?8 >urש , qљx6x&8:P[fC.` "`V?^[ GǢ$\qs!6.oW`lSCj%,}V L!*KlF'VҧӾ#, f{ C>%$ÝUN$#A3 C~,4Y Qffî ?GҌ[DAViR'+UTgCbwC/AelK e'~Y ?(f p@An2(xbQ:{8C {I;!y+Tw߀KR)/ fL^+^BTo|xiN,#n8 p2K&'QAx$,\෬z$Y !VػlY3?IrQAz.y5 O'jJ9ܙ)86tފcwN4ZfX^"S*H{>n;+n/)lC\|6V zgSzW lHW/r%])O@J؁8Ih2-K[B(8L~1 2xlCf0b*fAVٖ?Ӏ~?kxA>I{&bfzMPs%-L#y p𬂴f Qjp4+͇l#f {ZmDe.1@K0ڶ"GAH&$83HNLlh,K5h/Y]{&2X<~AzKlp 햣`4@z38;_ǶSkf;~@d$Qɚetb|aU/bƒxrԎDaӉ͕Rr"nbs,.#ή|&Ur_9jui]AR3pbֶnRgE3}~Od1'8\Sd(W_EWԧq~jZItg+ A>E(5zxio> uV-Ĕ픦 rrT)w4=9gĆ.kx"uDM9s9J9:\db2>/ &J‘^38/uCvr]I?\9:t(KC4CP &IDA#SJDAZ`!3!H1+fiXNA2#u U:! b!8 _#겊+iDAV/(Hk,DAV S1{(HTPh!YYfR2tˈw6*GBpʂ}\ |kcw d*Ǽ^",BbrY)&IBX\ |(k  RE!%K;;L=H.H a4<ѧ =81Q) #dLb3bʼn R.ŪպO<8+׵1K'd#)G7QQwfx2N[F%dSXkZ~5b.%jl2!}ߚPT_G& =NN_sk?UH&,ENrE:(b J'(^3 Қ)ĬcLvG,AH@7wׁZE_ 0;eQu6QiĊ(pc, L4(fp p(8 8]ADg+_% RkNg{ NQi%L( `k H%VADZs+0R)4;)Hk& :Yur[_[x7O/$ڊDb߻3 "yI`(ADDDADDDADDDADDADDDADDDADDDADDDADgt;SS IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/directory-toplist.png0000644000175000017500000000121712220076757024421 0ustar thpthp00000000000000PNG  IHDRXsRGBbKGD pHYs B(xtIME  85IDATxݱ P_&:#qG`݄PXPs:.>:6m-@@ @@ @@ 3<-GUSѫA@kX @@ @ @@ @@ @@ @@ @>%$3ޒ@z2q-@@ @ @@ @@ @@ @@ @@ @@ @@@ @@@ %9ɡ|9b@@ @@@ @@@ @sz@^|MIg^qX|}Mkgl@ @@@ @@@ I'yCV3sxIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/directory_icons.svg0000644000175000017500000000717712220076757024146 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/share/gpodder/ui/qml/artwork/download-downloading.png0000644000175000017500000000123012220076757025026 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME /-IDATX홿KA?7Ɛ&TD "I "R6X%M~m$\!(B!\lT+yȭ{{{;!V;0Δ(8=,e` [J28L'@=P׀f备4/L(u G,Op!䜯*s{-׀Wa`Kc; X}U Ȍ7oY'_9;T%.8=AQO;e3qzp.0d|it4J+=O ObF6NIwL f&g{n^v {jqe4{f &3n4 i4+Ͽn+`? Y\]V)h`R.q tNs" +a`/7x!Wٌ/ \WgpYB$$π5`3kвʨsN'k9  @Ui[ 0,yW!~,kHgIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/download.png0000644000175000017500000000120712220076757022527 0ustar thpthp00000000000000PNG  IHDR((msBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATX1@@89N𮰰U]jcQ +,,,`XZYYX+\%b!+r >M4f'|M7IPIcK}~0#Tf\WKt4/ԉV)O+:#`8y &@_i1?cC @pQ,Kh('E(ڷ g6H MBYUO(kqB}5+yh(w^L!^A-4iN㾺!&T}[S$T} ;MREP@T wQR%AUA՟mPT9NNjq!2M\6٬+6\&Nl)+isT3-{y! KN:?:uVccVqS>ty;-$uò=f2eucbi$gvD>&L+1͠R4+I}fz) [~~c!~ !rTgIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-archive.png0000644000175000017500000000277712220076757024004 0ustar thpthp00000000000000PNG  IHDRHHUGbKGD pHYs B(xtIME 9tEXtCommentCreated with GIMPWgIDATxMH#gIj\Cjŀ۪A{R̥J]ʲxHW{={I!ҋ b<-%zǭ֋,c$>=I Dc2Y/d}})*TP({bdx lR}> J\hllDSSSI"Hd1/2`0n'Mp)&N![VHŒ:SG@zzzR<BROOO&S|ss3P2b)L 577gzZkxbb(Jh&&&2!I,yޤF!IbtFa!͗g9^OUvwwI׳F )! b?ݎQWW.tww[?a$+K9BYs\ʒEuxrR%KT^~:;;@|s!Y*q^J7F_ƲA.0Zl>qGmmm>URzX[[yF'''3ɘgsmmFj97,,,FcZ#YLZV6Q $JŚ|\_T*Z__bz F#%"׳-b'|&bXVDF# %%򲠏qև(=1ƿ￷WЇa}ht:D"YM%#'uN{y$VdXZ/R |iA?ZHUfl_^%X*в,2TD|0^+;(Q$d@~B ƫZ @ZxՊ-fbmjtj(ʩRARdfffD=X,X,D)CLR)@JtgmmmV۶cttaZ]]նCCCR qsa1[3+ RWps ; ~^/8p8xއW( ԵZ(I\3H@ PKK ?{FFF022/l1^mb @0="B0{Peh{{P#V>&ϩ\u~~N&IAm63l,QPn4iccC666PʫR 7jjjׇ^֊:\^^D"GF1*(q7nw9igqE3)R0j=]u vk$=+S$I>g~Xkijι:e )){<Ӏn{PZb9AKk/[\OnܽYb @zVO{OF=:Tc:K @  @H @l#_f);?.q @^uVZ$I=sZ"fSIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-download-cancel.png0000644000175000017500000000242712220076757025405 0ustar thpthp00000000000000PNG  IHDRHHUGsRGBbKGD pHYs B(xtIME/tEXtCommentCreated with GIMPWrIDATxOhW?o*TF(*Y$xII5BT`+hKJږ% *4(=bZo[T)6Bb-IS ~{-y'3ٙ^v޼o~Ċ+VX"*HJI3ƌE_/_rF`PP_ʽQD @ D| οz: Rf)o>_)Kjy޶\|RZdW , Ae\u:0`)rxl9:|n)r xrv"' Y¦K~'p_Z~m^@o,;&?j,X=^{$gJ}d`^fF߅wxNs<tt4f2͆s'u,~vr+3Sx+,[=P@҆ p'+x-dn޴Ǒ1:irH--J:qU_ڶg`ehwOںuz@ھъW"Sxv@,.BW\~p4ǺƘAF&IӞEҮ]#r^8-iߏI+ҒmszwHڱZԊI--,xEJ7]Q7YA;={39joN[p%9ղﵒFKoښ,zQIk=)َI&aw߱קld*pاld:p"p>)l$9S62.gH-BcݲZ+ةfqpX@n6>gKN /3\80G62M$/@^8bƧldcf#Ð+VXbEAPkٹpkIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-download.png0000644000175000017500000000111712220076757024155 0ustar thpthp00000000000000PNG  IHDRHHUGsRGBbKGD pHYs B(xtIME  tEXtCommentCreated with GIMPWIDATx1N0F?bڕ!02; Qg:!4 0]XˆD۱n}i!P,IH6χݛپ@rClb̽& $A$A$A$AB$H$H$H$H Lys'y𹝙=w < >l+ q 2 ǁd|\TxpypgfQj.̾ 6XAn-SI'XʬlRdEr;m_WoXISmtl^{-I#l#eIY?p \lދ5Σ]_r y W<<-bE*[9Xsl+@+Dz[,e+X#eKXlXs([-B!&IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-pause.png0000644000175000017500000000042412220076757023463 0ustar thpthp00000000000000PNG  IHDRHHUGsRGBbKGD pHYs B(xtIME BLtEXtCommentCreated with GIMPWoIDATxA EAw]!Jh3o`$I$/I2rDw# @ @ @ @  @H I$IUdz˶IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-play.png0000644000175000017500000000101012220076757023303 0ustar thpthp00000000000000PNG  IHDRHHUGsRGBbKGD pHYs B(xtIME /tEXtCommentCreated with GIMPWcIDATxq0 P%:O2D=Oh`'H!EJ'd2L*wxx#:=~5yŒ&O%ɓiEse4`&/CɋiTq7&oAɁUCiB,JjA0 jPP&Z4T2MhR(h&iR+(]bA JѤ^\0mێbsrTV,(ET5jըZFAR5̂J԰ *S&\ 5 Zՠ jW*F (5H ՠU-^M 5T SS%VM j5+IY%HFM 95$d5r1d2Bo}HɗIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/episode-shownotes.png0000644000175000017500000000173012220076757024400 0ustar thpthp00000000000000PNG  IHDRHHUGsRGBbKGD pHYs B(xtIME (tVtEXtCommentCreated with GIMPW3IDATxMQƈB&fPL)Dl,|,(RLf )B!MIQ|$4`&[3u;s1[sN9?qqqg!Q8FO@fvsw.PB=N@X@#V%9Y&Ro4c>4ԠKz5b5cQ쮙3wkWV/$ /DH0'w3CRkEE'`=!4uvU 8 t Y-sN{&i5ZRG$YMb W6Ӏw:`l x+k?a5oN$:\ m@<.\l# J;jb}pjaVY$$]|{i*"SٌJ7 `JV7`Na_df'þg14qtV#k @%"j !VY}ц|VK&] l,/TBl^Ln IRό؎o'];dg+3#(6YckPV&p44 =NgT74B!S.yN{x&V.1Uv4vF*$"^e3[ E0-Ҭ:ѭBl0:VzJd f)bvLfu 0LM&4',Bl75IIS5^G/1_/ff]fv8 Tذnb0dĶ]|jqqqq_1JIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/flattr.png0000644000175000017500000000307612220076757022222 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs  tIME90U[IDATXKl8~ ٷv;4/ 8 !"v˖'J(M !BG !hC`#7m;׀Ċʆ*y;gYνwy:X( eYafl9rf&'^ZZ d/(nt9uu͌h%B\d(A&8#JzLbɶpٮ Y[e{].t"P;&xcpضhċt22/`[>ţGͳ5VVXAfK)`/~Пdy _{zKw^ϠVIGV\uB#! ißnanUA !VnpB]Lr25l}conIA]4 6 ;8 S2S6epo~nL֬3ʙ5&0h181{͕_50+{ 61'\WaȒa8y i ls.bRjDWhI{SZ~g=Xr2`)R-L pN))gzNifp!SLiܜ#Lx"C]q:֑s__'/j^UmS߳BWW5y^[4_ qj%`YDt˃p2{+H/ cFkiX X~*r8΀ =ҳ%óT@wR'JrtcH|VQ`hRضcҿf䃄"ܝppm㧪׵덫k<6 gEoi(i/j?IJëe {ԕWWԹc~}9 #)Mx=i#9"v1^A눮[ [#Vtf[e?{6;w9;+eP e|!HIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/gpodder200.png0000644000175000017500000004611612220076757022576 0ustar thpthp00000000000000PNG  IHDR~<sRGBbKGD pHYs B(xtIME#w? IDATxy?9{ggfve1, n(b\Q\1Q_5%F(+ 6lìV=?{^{F@a5jKDھZ npy^TVV0 Dh\.dee56~ }@ psX M>͛7cӦM ͛QQQJF(++CN8Ɛ!Ct*G6w1^N***7nZp8<|pyټwoʏ̼g0hmfVVf> z{o~à B3f ]v _m_ T8SO=ŧr1yxȑ/K16Ĭ1Ac×]vk*(../3ن1sE24,Y'MtLŗ%\›7on kyX2O2 ɾ+x̘1-lܹ34y„ <~x:t(ݛv#4o&>p@6 xߏ^z Rfݫ4h뇾}O>ӧ\.W*ω}aΝؽ{7n݊˗cŊطo_+77wy'd_M? γf&s޽{_ssKѮ]73fpv}e˖%f> 9?N3?2ޗݲeK1;w׬Yp@FpB曛4|mIt< E?.<7={6 iӦg}Ʀix_|z6Ϝ~=\}i^y4hPٳ'Z*Q|fL`6Bbu]7x#4Må^{K` e[ @dŋƢER&++ /.x^Gmo!Oßvڅs96lH-! ÇrFo#y?б!3n\XnLpd I)1gu]LwΝI`"-k},?\tEkb̚5 ]vj/x@ybSZg  ;Cve0 TVW@>T{N6v5I` Bޠg${;3{<{a6зO~ӧO7U;a̙3;&eқ͖- 11&FLj#Q_3 v݉;4 }>.P:y)}8{\ ?r-j]vixvU;&}m?{aڴivgŕW^=sP+0?e5 JpcPXn)A+?0@K.g ۨ8bԨQ 1m>vtsqƈIMuuXB(|K|'PHx1czF:sBQ{ Giի1yF߳gO|@"z(C2X4E`Ԡq/#6A^n.F  AW/$byrWZhBG Ƨ"''o۔@w_;7Kt͟` ;pLڤ1_~%zࡰbkvFtzO_]֫{_ZӃ:VUb_RToqᖷ=U^> ?4OBnnno d3E?+k<8)jM"gtEFyyyoJ6`)05w;96Rn4L={viwum BC+IJx."zN@L"YB۷oc=f/v *nKz\H`my& /0,\1Y@߹eRЍ跙1sѩ}' Q?g"v[P,^xcqqB0p'[>S_@9E~5kvܙB"*?!d~/ t7"dv`Lu)KxmܾKo%F1w9Pٮ핏>(N:餄㡇;~ܾU!]"*[pmm-zTgq 7ī"V,l ЯL)8ry]u=`}U|P0 W}á_o]İ !P^^ѣGc(,,޽{i&,\+Vc~y?Erŋ*N7nDݣ:Qu4?t}XtiE[2N ۻ9ϗ_MeEʪV7,FK9p0lܽk7~ PYw(暳: ?ڱc~wމvvǏ{AS7p}Y{DtE4уG,VZ;P$"ډ/+rY{ 1cƠ}hee%֬Y "͉G}!DUEé!ckW6baj“O> .dtRWI)vxb v$Ӻu0xiQrrrg'F| M|7ۢܓvxUCD#;]wq89s&jtV]]9s੧ Jq\7&t+鎺| J f)܅u̝֠;7Nv>|W]uK־=-[=4]r%;wn6y\sMh" M7P~qt.hBjtСCOwɞ}GqhN[7lCΕuZ<|yz޼y9rdJ=\s5-ǪU6Xf I dr&۬7MS`-Ne˖-Kx2eJ"k" e;/r;IVر#ᢋ.Zm^^0A#Ь|GD|x 8jԨiy. /"ƎknÆ ~}XYLnƤN-7ir4h^/xw ۶mg~_cRF 1eZR~Y֫)pŏw;[+V4(Ν;1~x˻---ƍQXX׋N::>l0\^"6NY?쳤 xСC#G9btb1ޛ~0wcNk;eeeM쉎ݻWTT41eʔ^:^ky63_7x?gD-\0G+b{[fqq1fϞ ÑH`:tY?四nXEb\MQի'NL:#~Y+OW3`y~l6k}'|]9ڞ?$Jg?.23r޲ nb513YVVVʀn@~,6RngƛIS>6@ #];sbʶlRaÆ&M /㡇aiw~0i1QF›]ӡC@O>-BIIIҌo!Er Vx;-Y$Flk !'}b.>䓈(8'',^cĈUU[Wo)uf Jĉ.B5W?e]?CCu]cϷӟ֨ݻmmOxr߾Y/W\q 3qK{[ef򤖦L(1뮳\k֤NqRv~?mۖx6Jx7P__5UUō7bkNjtv"h$}hWL"PbG#3Nm3m0o2B*7y_R=Io۷oLoINjY(j$%ƋI<z>b?/((1|U4ك/T&M:j4<'xbϟ~FӐ!CСCx^iQ]]jjjӴބ?H!IQ_OX8qbL]-F2LjыRD#OmE R!0sز%#gw}=\L0㏪m> c:>ǬŘ nwe 5صr}Nǽx3U__;wb߾}~}78SRMH1`lٲ%~ eeeM_2%Dڱ6eSo9A#}4S2c}iiibeeeٳ'nRf1?nCÆ kGKMt{AD "J45@*ٖVdcz w|iРAM7WS=(d6PJUΤk?i&[+c vqLi@ z [ 0Pd[Gd%]ۼ{ <~rH.tA{flfBt=aM1 Fꊊ,>8 xkdФ;~Dڵkַ/@K .tڍѨu#@1٦ O)3SŇ8!wN:vآMo4}0l>Muw"J7>EeVD0'|TTT7l OƀތKs@ RbǎQQQѤ@x943v)~OKYp"$+7w0$k̬ YNk|8:t老bܹ1$V5Wm͠?1=ϔ\orr)%+,XRK.>|8Ə!D]*u-vXADH m݆>9ׯe]?/"TU ly4@b>''ɀR_C=pnݺᡇ$%c儴s6̌ÇcX񔂯*0k֬F9~&ҨVu>OChff/ˤܹ3fiRvqHmUL|>.”gy1 Rd22}>a}<{yUUƍ |~/)N-R3"/Q_"m݆/"w&O<svms&^z"8ܒo#FMkצ}_jҙ%CDĸ&l߾=)xb Mzo|*++Hָ@u[dJ =ϛ|@ }0 wVfyFN;&BaĤ۶8{'8f7<uNx/; [֬YD~ɒ%믛՗u%}o RngB`L"kj=&;,Yy 9fYR0sŚhng3f9&ϔ\}#4<}7 i]IoߎFiO07fo TDɔ\Ͼ(>@48If#g\.)JR:Mӌ٪3]vh$mc+**ʾڸqclPƻ_t&O*:Yg?QNߘ›*u5XkhD'2}2)!EQ,ZƺK`{cn%ݱ'*ҥKŴ9:thROc(FrW`„ ر#z:4Aƻ'3!DT,^zA}bRV܋ke!Z*}4']J'k;묳tRlݺ>Y6İapWb„ ѣG2=艨 '֭[!lT4hP\0~u@JF8=E^Q' .Qa&L1cƠGp\1L+^a6Z}&@x,F[a6mZre`N+\noOA3Pukᗿeʿ}/k)up?[ҌwlڴQtbС;WAA&N$˖-.%wG+ϟoGss\wupIWuuu֫W/o{m۶%7 rÉ13 !2~7IeanMqC}>_̲' IDAT}=%Y1x&=~p6:3r3;``Lp+JD~:fMD:%%vԩ1* :bũܹsrcMK/$w瞛aīV,9g}ć~8f+}̼_c;ylxg*+¢ER33.b̛7GD6m/^$H˗/isrѫCoKٳ>TѣϟpEQ0c |;vlW;1ψ> zM %y3f曘fvwT0I$w*ܞ1qD\fСCSUUq 'k~^z!B";䕢]nq}8(}Ykt邷~ ,<3fફ“O>'D9>8'G}rAUU&N~843< jy3N&th` +WĈ#jG4XLjؼysMټDχ޽{[=cЙo|SSڧSN'|Ҕwݤo$Ĉ# S' /0C^pw+D// æ?/l;Cǎ- W׮]|78"bϞ=ڵř^&ak믿>j 6ΘPͯVݕ͛7'N7HXrJya>r,`0ӧwމ/Oĉ1j( ~FۓU-> dۯ1gΜz98,Ss5L:t(F#F`Ȑ!ѣGZ3m56Vп`z&_oĺu:R-^\pc.GNۿ;+޲=kZGСC4hPCfP6 [bbhkcUsr0p@ <C QpI'2j [" gӧ[d@ W^y%ee^?wզCPo##Q%4>y{oW7alܸ/rW_+z <EEE4iydn7Z's\&v `׸q,]t` tZK1|?M6zH?T‹ "gW_}5+:tÇo0/S׽Koo{=[.Q`IJ4d npA~IpKxF+& #,3gqaƍG،:vJbr[6f]wq^~e))>!6֨_]]e˖aŊXjV^-͙3SNMt'U>Eea":Ħh񷴴WFvvv(fZ.<W?_?Zsk)V¤IHw6fІiQee%6l`9V\i1<|D3Z3Hco[no3~M6TUVNEĨw`΢|Dᅬȸuuu8첲@qI^#_QJcɒ% {{<{ԩxvJQx=|UU1&gmB ףCa˥qYnn6]VVyoߦ)Α/f}$;O?WwGu @9wޘ?>rss3!kſe]8:ۻ@7{uaa!^}՘T0p-7ߴW} f枟pg``Μ9&t .D~qMu fy|xa/fKiW:@JnюWvoÁ_׸kct>3gbɒ%1F? ZZ `(ˊ+0eʔ4%eeeV"7;²)х^z)?%EM~)rKCQ^;x{Z> >y>@h|cǎM*#o~={buo6 !w)zΝ4iRL@zhѢxEDOB9WhoWvf͚ :b|I \7&R$ @Memw,;7㻝3x≸ 0bĈ ʕ+[oa׮]q E.Aka#`ʔ)1{UV˂ k'=cdxqs1iy0M٢r W|>ṼO>}zgY:K_ t@7ny睇/|ALj8묳_"D^{åeŬ(:\fsFN 9YR?Ahq߭bW:Ӊs3ΰ/\0U$LÏGNsDΝ;#??UUUػwoBΩ**vBw!B5Pˊ8,rs,\3lavڍ^! GRe:r)R̞=;^g@0rhaGҕZj*k`-Ԑ[kQLXjBo T^UYWYdh)u֭駟Gy3gΌg`#qm4#\9'q4gˊ8 !,[sg_8@a2Gpϊyf\{,rъ#sybK$:Zݽ1iM-(.E  }QKZ鎐@ ׵_E%vY@~ Vd0g?mׯlѥT)\D:,\~q=B>>ZMDAa$QJ4)*[ 1زq9r(8WZ[]OV}dQ%Өe-w/w| $]Z `C-nAwZM\ADjSN|ژ !E(荠iB Ȧi<?3d8A6\m6FORJGK[@V*sK,ۚEA 0-(1h ryAc}j@* :(2S1v}- cھ;vq]kyuR*V &84x$(Z 醦0LzK|d(#i}tpw"'6naoKӔ0 "]j%߯u̔~wSy&gG !BAV>啠= i" @_/^x3*۩8b8{K@{9\:_m\yp%3 :Tss(@r( f_:4ECbCppiqs`DS蛅aG1 =ey!Hw xɲePW:h cO"C$G;I Ҹ2hUVRf=̣zsƪA[ra9 I_&)e/{iJ`N2{7@}F @3( TBvP%pPj)eЃ0:eK\ө}NB !&9 P_‚b8W ݀0tAfF^Q.ݮl %ǩЏ7\ѳ FwP4AP;}G%7. [3HW|B ! TW. ݀cq7ˁ}s.ؼk#WO8ev]"!˕USSCC7,PLÄiHhQ>}BUpFfJ4 qdM:Sb){ld`#7Luŋc-TbLf!wJ֏AAv^ !PXTa#q*[ _ _ouM ȂF;9y{[ n]U=EԚ͍rap#D(f%$PɠN9,gY1UUmx9YhW Ҕ0M oza@jre!7'PWB84Lxtv2M oA YU4Pe62/ly* p2xJqtЫDwh(-&τK6ms.)^a춺C׃:Li"` iXfD3 .Ӆ,GX?#J @ ֖z&HЛ zH98zhf.BRDῊ,)<`1 ~OAG $ Fq,=M=Dܬܘ=`8)o|)ssE92 LhXAarP rzD(ɕ}݈=M=i6PNV.͖ ̰ ^PP̀aY AFD㎓(<ڲM~6k4cwOzc#6t@LҀ'xa9\"4">%(! {afJG)) 'o]Ϣ&fzoMtoϯ"l p2nP Y٘\M0QQϸ"UR(֗r8bZ'5r>lĴ(6c@o ^Dt)@S1c|FEaS"("Z33vn_gdЃrl4@.h-eQH%[%40Vw;jbv/~ɠ;("VE`ipaذ}A tڏg^h͠+ hVscan<~Œ-lrz;菲"OIk(iqvtvƘǙ*^f|}jӫ-,Mi`nOME7ύC/0Xnw}i*l[: ꟊ塍RC3ˑ4L޶ snMoA<0trxk m :, >l=6/wQ%EbyF{+n-b3 ˁ7pT_яk*4ͩ%5 *nZ?\Wfec߂&e,GN=i $`a|6 3PP9F]ͥyy&8 &qpO1/b>]"^anMn} .+ӁHYE H ?Mn3ہlhN-nEn7Ma֯q 8u5vC(=%aiqzh\Boi4N>:&?28I;!d㈋ 5P*4#ɝ}V>3q Au*K:*+d_/Ü>z-F i헴/(C߮PTTr6)C͠ ]7\B+T"BW=׏=`oLtJ285wMYYYfdn ~nL!Cǀ#󺟘e 2tkJە™H;DPJJapxh00[ڂ"¾_H,`94Qqޏ5KrOא?jfm]Au99RpeƀOc&OϯU<M-)u/)sХ]tjY\ZaE",RM Yb_~rEbE uD 䩅U3sCJz TW͂%eA/z dR*)4iaJiHfaaF04rrrZ3sM 9TUU ,6/!{Ȗ@ ݅(ort9H$M4*81GD,I8cd#@=a=mXGʏd@8Lhݒ}H?õqj)~2"RJSbdJU 0@w:M3[7*ݓcd֚;v0mDDݕ/<>^<iNvI5:DL,%I"'I$%0` f6@AA  ]H %`T˓F@?@ܹFqݪGU|!M :YNU*N4TGԤz`& 39d!' wV]PU![B61.J IDAT:S G D#@iSF9΄`*rmPL!k# D )àaR da0`##HA?"3Rǰ81zjwu̒JAdHWWr3p!iS2cjըVi.- Y\ .G'\QY&S24Ý!#~ t#44uF#h 鴈q:aJݒmmbl (fIb C)NO$IR0R0`)HH$!H1.3Q<! WP)B Ij)YN6Eh,3!LMUS^-Y,ejU*}ɤ> DoF9t#WljPUQ*TL PrE=:ܩ9,*4 9SJ2ה% 3kǔ c& S!%4~ͰLLEn A" 9J fI$u:|d2I0!IBHP 0`::8KIljHEgUUEۭU#"Mi`v@#"TADRD`EH2f!Rf)`i8:+P)% Fg6՚Bu Ao<r8D 3$1TbJ4D,M0!I )4#V!J 3Kf~4++ mcE֛OTvVYYCQTՂJJD"* HE(*!HV )VR0 3 fA X2MI¢;e`*!P^Z̨#5Q$Xa Ta\e*\ O#uH,ՙDL&$b$4)l!bBJ" d!4ɔ$T4MSHS")j7 ) iփCFVVxt@x//Oz`VPU **i(i*J!METX*B*R(R PU&)L +gRb *R(#RE X F1( |H8z&3qA3Q=3I:I\+1eì3-Wrxg>RN 1L 2Lb$'D2rI$L&!$B4$aJS)"B*4uCHՔjj4`iM9+vC҉55"D ݺ8Kׅk4SӄiB35!5S*4R"`"XeR*BUUbf f&2f  )c!CfEB ($r Dܐ!E61e<8;Q@ :1L0 p %LD?' ~"Hf$0aI:SNdh G-0 h ax8qX!U , b2" M!$0$ RTC ]HEQnT_ H4~t\þ7'մ``S Qd(+.d^uS&L)"B\$ә& CkIPDj aJRYR@2f2TI*g1Rh*{l|`G>PXkf L*$I8j q4 ũ(GHJFlaM DmL7‡FU2-˟ kՎ/}隔R"^/Ƒ9C3ϼ9O SgDNo:wDV(~Wlr3io"8>\5v+'}D̴iO 辰!73+{P C3MP7,3``BPQ!UU+V׊WWQ9ж!UDݡ^*5b-I|8Z,k̢?] N7>~Oh[4.GPLnMaj /}9geo] cP xďGb)3Z ["9MbnZ([1%}^|̭ozZOKsd l{ +mŘ!> FhDoZ6mkl hbM=Z J [A]mu8;Sc0>~?I*Հ\s(IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/mask.png0000644000175000017500000045662512220076757021675 0ustar thpthp00000000000000PNG  IHDR  phtEXtSoftwareAdobe ImageReadyqe< iTXtXML:com.adobe.xmp K Z IDATxڴkKԚELL,f?HllnUdU_{#]/SwO7wQ漯Ӻu.joϩrs_jfgF yf;g8և{3mzt~{9o k{=~ſC/w6w,<2}Ÿkg|m{n"k;3qo_>k|Ǜy>󘶃#ҿ_ \~q \.ܘƲm^@0 \糭 x1Lm4r~F%]$9#J`{ s$ICض96K_aӤb;so i U+9, x6?HИ3*$ i0E?眜h3O'KlnN2'T =#K0;bp1c罶'2tqi5F VgN[7IDRUP2m&nEFތ`? "\KQ`&0,9'qjKhX:ԹD!N[ j;Nŀ=)f%ڨzη@ UhɅ |TװkVF^;ۀ̠|tyUqU5mgT3nj.JjFM2K86[*`<4Ků؈=کഓN` Tv(_,I`HL[C-Q_B- &ga{4q;J=a"?:-ɆR98;0-c@PKY<߳:Y"SjN%c{'QZ?0xlIȜDDAHmFs^eFru|6-~6ckm 5X[~mQib;ྎX1KZ- LN2lNAn3n,ܒLB$ t*τhs>g;ԓlʶiq;Ngju!aw.* &7 # T= էֶC9H9 amhrAm oӰ9M{L@)uشV%3  bZdo/-ON]_W2D׵b\`ޒga"l_mܻ7뜅p+墆0Ph@6$@ؾ4҇pо-XӘn lJerQo*J߱AY+zIJZFP/fz8vZtբɑ:3}.oI+Ec>NU9'DPPeT m;m"EVXڞ潢v/1y{4偂"@_8s=!ow6iOsd )S=1o?@TAf\DPV:* _PfBkJ UaӹdNK]OGnKeR S)'ZLiVg߽ BTUYl? ”M/&2ֱK vpREm;d&ęM%AiةpwTBJu65RwV:҄uX7J< nRgg1p5jR٠8FX|jI> `QءnhNA@Qiܸ  gt\{0%muHHՄ08v-hm*-pħfV'1TBKe{dY3Y2mGQ_ Uk3ipDj/YK4vT[5M+u֫8M[IK!7vZϨ5yJҖ g02,l< uU~UB&"k$t̋XEV= &[F(8G|te2FFpNxp (h$I 3i i`=gfDF;]J55EYӡTT MH[ u?ߘSp )y'27 VO ;m+Gz2qK~`߰^A~Va ;܀``+Z@Y'Z-{܉` 5@l:X3tܔH[R *Sd2P$-Vy}NU&: $!riPIUkW$>OmDŽWg[sCJDn AO FBL^X.ۍKI۝uH4GT䟬i_ߥu{=5@>48#o> w{*8? N ɬCtәrVS8%| ACdž (]]J*=mQwZOD&n(B I߷ДIJl9?'qq~jdz^<oP)+&~bچyNtni-qp [9$ [ҮCT-@T/w8?% o½pY4Q=vtnɓS9ϟo-U6U#rmjNA4MsfNH(IoZpyqV*i+Z#d~6C^T4$%)-R0sBcL Ÿ#k@TK #}<_R]Q:"Qyˠ}f%(8O#<|&7[vNrGmu)u,46:9;sT859'+dCցM"hj$N(I,@ "U EC;Aժ,?cCL`Yw&C^JҋK|05~PU+ +=\PR\'u V%FHjxvΚ d{A59} <݄[D/c; lp]L(ŴaPsYsae5"Nwb!Ѣ!`ݥt/Hw\紱'4% nvH NAIzQe# I4"$IBR/NJ +I*$i sN(ڦVynB'NϽkGy)=& =)m x8$#s 1.Q.c\]u.^f&4 M}ÎG|o )`*U-AAwS8pHfjye|/yh2ST6$b)^3Bcb;E{\!FrOGtvs갊$]z^&} pm#ѬIGsGrg9mQSmμU;v(xJù G$ Sf#Cpnbghlm5P X͠P,4R au)`5@!"87Fa Fv1t2L}QUM9.AFq;kcy5|I۠Ϯ3[ iHٷQХ[I߉p%鞘i] $*il 8p-Hϼ𓪇k݊2o(?D}i䪋|l`צ3&SDfD/q D #TۺJ;Sjgq9)FfVo 'X+XςIG LM۔t V-A](ӹE>=.MVtlKȸ]v2wL7B^!̙w@ɿWɩ0vjNC)$E@ 5/B?t6DA4'{ yJu ɑw X4tn ^YXʾ^"ءWablW<6{|@R* NalN*8=u#ZRiqyDM0Nǡ[V%*%6iGt @S༻G(T8᫤5틢ԼILʪ!p|Wc_Nivʴ ֵ6εϜц{57-X4 |i@Cev  .7u`mIC8ĠJܹ!C_!I!sظ跋:Ҡ$E]zeuviHt GMتG!%tBLwI[fCg -l*M@JvHB+^١At&8PHT6~Vٶ8"28v/w#q@v$JcRp渾A֧6ErTkK"\p]N{)\CiY8T$fI[á澜-aV|AOMi#jU V8q*~#S=;Ɋ $NnqMVՓnr8% qL{wh= 8tl-)?~PR4Nf8 s/ݞB4J+Dʺx;Iua[$)PQSIDIT5t拾 {H  {2џ!PJO`NAn{oڢʼ\OgSJl͙p}moaϔM;qqr@0 C !>i=X,5YFw較K4&IDڛpA3|MN SJU'38n򡒍wIh$k`ۦ*͝sB'ܪ'Gw UywͺLJ$-m6mRMǡVU.RMi:ۑ@`XיT^uvܙD$Ϻu%j4< 9N^~6e5f3dͩ҃x(*8 [yl;qz0"z_B o'&a̠`wScLlT-T t@)ofb[(sj$ւFD\P@;& 8j\W:hLHfn%&*UZMWp$rtwL N?0$_M&kW|Sqza8vW>3*H@  -5O:[B z\Pp2% kmd:NfiN&YU@6Xv@IL]RMlS\ѳCҚsoA+o9 I>{@19gnG Uqf-J3wwiظz :*-=V (&Hy {($;) pȞoO: `99UFhms**1y`HH}e 94D{}ܐ9"I}A|;u3 4O֥g&`an %$9$Y kvݾk1%TRvW`7NTbD N2MNiQeqU*۲pŅ>w|u$T +<]DE^!mP x79ک@@R{ƝHU.R8iE#%ID2Jg` }]J_MZgM[$en{Î4ܑNإsvC-”Eʧ:;2z̠Nm&ipQ6S?`2L]:eSS[ejZ\$rsPePp;S]!ooC-P 6&P A6 :J>S'TOI {1i#XV2"RvY|T0֓o0t'Թϩ*j&4lm+wy=Bwiu$(IYt=TgwSѸ vjhL| i6!UW{yה׸I6 (@.N/~!e-Z;M(r{6խĸ6Y%=K)#vsU~yOB~5'EjWlӘpDF9L{H9lT9/-1RZ 18%}pdd8#e-'ITJH:n8 vjLgV/4a,c/nf]p:h~uKlXECw@gI26bZͧiɛDm{U WCxDUU M?}F`o`[ռKD" b.h," `괖u p.A{8K8 .-AT8w7r`D՗(|"O' w!iϒ}NcXeT<~y7ݠsRV]; &Ah$!ma_ ^֛pUY#SUg:ں @i?ϫJ:XEBu9ag[͕@O!Y'x)I ]괧-u(Nv~jHh+0^d/V@O d9%6>l{ QD֊VZәM{]&}QD[1:5 A,e<-$i%UAkooOgРEIkYXYR{m[uIDv:{fz2l3ixF7# [BD16HDjؓ;Ɍ.q]](:tKOìc:j Ru565:ecRSbdI%w;4t@BL)3zp@̶V1u$`W.d}[Qwt6 J0U+툤mg)%PtO!;dG<v¤J Z޿> r(sD3=GF\TU rH"^99͉*#D@ զق1ڭCII5UVW[Bm+*фv(] yU[,Ikv2t.|CӪK=O-͡趪E[ژ!!!"źn6s9H :?G$~'PUhI݇# ð2Qfn``ᶾFUֿQ1opOzڇ^AOx;êU-M~6%gP8g d]iwjB@kG*P(bg@Nč mMe6OU՚0NG4Hqʰ[; $GV ;R0T-&CrTY|;봽 Ν> e&=~P*h^4ļ<}[IuŽJԮl7MJhPLmSzKV2P0;L k/pTl*($b9g(ZBkM3uǰm8B.e픖U&/ߝ?D&& PH yBg'):ΚkkQ!wcfT4@p+9*0h`XI2nͭ>\g@i*7:"4X}M)s矜5$ cOb b 'LKj&dnMɰ0es?"*>T`۪KA; N}m pu{JXczȆ68H9(p BM5ZF/:GoD}&Idac|۰J;8w9Rʙ`T2&GaREnkǴ5"s'N'Cf@D$6.]Ѳۧ [%j rz@6zEŝK;. ѻqW'L[sp=RߒMC}(Իh T` D 31⼧I- K[LѐUR*V[pS#BODE1F"EĢTzbG$3h^SNi5 A#؂-jg R+_iL+_ lwZ6`2([6$ri(4*;LmJNI5"iR 'ibknr>" tFtHAA z]`N>l2V4'+PC)UYUǡިw''so'&_$N_˪aK躕,BH2Cm$357IJn[iZmm!7&-6 IoZ.ӟC*61tlCAA$*g?]b>4JBОoϓ*)a'>Uq#L}`9hm}`mw^U=6uu3H`*PԾu+9 {4#w=wΔ;EXrO ։9꽓`]zN0.gjZJu@T0 aј"Jn`=)V:JaD, JTՓ@ H] ý>jUFp/[ I:<ljp!=+DlA]7F13N8xj.8sCV0m1Y 3 U 8; :O@`60mĻjEgWsZXdo]Ktlj\ƫ^-6%y37w.lYj[xM;ZUR&4a6Oy򜏞MI}DϠ5i95T.'@S$S1Dx80a7bTiPxȳ%z;_t8eJo^ 7C)v2 O $lsN58}hmVD^ vdGHl8}Q'$`@RJ(8 &Q6؍s^[ 8fTdfnüO!J@ }ŎS=9M"Z8ƅln)P)9I]-uH/FW8ĂuK݊C_ϣI iT7@{k%okڪ`)!#v+wR S߯ j*;IG:B&7 N n™ؑrB,A`GixO6t|"&nbB6ҡUfvӏyá-`F&^]jS6 B)yJ':lVA*> *jZ"# ;5ΐy_ qs?[L x9><8'Z8`4ML1L83A 83O̖m 2} vI 3,HAӀO:Ʃ;TSF6JihI Z₤^r<7bt4iS*Ľ/d"}zoTO`U٥Fm3dxމsU)lRvtouZUKEФMv667dmun IͩU,aS :I;]jmW$1,6xPn-ᑋP)%iI Tk v\F,&uƸ 8 >h@fC⾉0ZatX(X9 |8%uHp$]*9a{C(݁,ߠX$^%պ"U^%QF[%jNByMQAJсm~܍2×4aIk`\,(aRj.A$t*S&m*!P^P!ۿj-G6 jވ nڄڰ)Vʱ cNu=|8lD/Dp%Ϲ N2OZr6}  Ӝ#$w -aT@gx296'R3V: dtNC:@;I)aPHMviDVvN kvPKÝz8-2 E†{fTh4'I[uR9ut i q`QӶOv{Ѝm)]Uw\nbMǙLS=nJ"P0@cZɾn3Gl ?I~_Cڳص:O]<ܱkv??R;kxKKTd?*S(Eӝ-1#صd.0PK Of5FqbM;4[@?|E?89q:q ֆ$dz;t)VoIΌ"!!,5PDUWgco@fjI&n@ө@ٺ8+(gY2tI.PP/8=PSEfn]5PR%Ϲzfg>8LN` *%aUk :VY_HeS<'NP2 &qi;qc<1xۿ/j(9$%۳R*m ©${Β]tN S]Y (BٷC4m@&/n%8ñq?Tn) h$EvW wЍ3_0ĝ*g=\@ 4}Ii1VI }5>bqAg!-qԽ3:О~mKp)"6":<~g\" T$N9 v: BSť>L$)t Tr(ioRO*JEg[J nu27bs `gmm䐝g(_oNW%S]ͧma"҂!e﯂D;F+849P~9OgCYH>OwP^ ua"@^z*@k#l"jȩMV7ۓ@,M@I%7n0IDڃ0mv`#PQg1m3JlC9?bf\vk>?ȸ+)CԩRBO$Ur–TRɽ=o"bʴpjjB٥%Vh" EΝh*˺C'[H-im\Iv7]hld -H@&҆ՐK&`C?Ii귖U2ŀXzv: JUQ׽eDjhNqMZ󤔒 nk3z *tݝr6Aw<)RJeG imrޜ䶗J#iZ(VmfKvb{r'<'Ij}-C?J! 0$ ؘTN? ̨M&P?J+R#W'vSZ =ctMYtg^ wYc/YB!ZG-|*>,6i!ʗ%-`x:bky S67CM RM)vE?4ȧL2rHg~&U[" bDdHfHj?y hG SlI(;ti\8wTkm"H:$u|$A]uIbbI m˟V$g7J?9$8Rodr*K?QA$>`ʳ}sQE[%ؓDLhP~ 1KZBXAj"Jyj{pܺV Uu/'3KqlrU>T9Uc, "F up~Ϩ̦& w bn{3JO- N٫r8eU\'%+/wSf)Ŏrx/IN//oGQs^ ty;'!ʄѧfDvԨ7@sD2Ha@YђBi$7v7q%vpX{;;&KLHp+V %(Jms껢u]*T:3:OdRӋ=v`j<;eÄՏR :8v@-J\AgrJ ySbbo͟$ZY` v "xh9dJᩒi"9`ˡw\+i` ԺrGF:0l9zKKTYN{^t6Ұjgw"gtnQU־IUL4WDb), wk۽z?jCU(|T 58U;%9 ppO~%',_>(afZ*6> tJؤE _$AM}?W.,9® 歾 Na0U@Ko'HTɆ`-#By:;܁{Vl DYΎ$Y; p7GN Tg\^:$I Y1?)eqU$)i"N}BOS$=HD)~yUPCSmG =sVP4NMK 3Gc7TґG_1ЦߠC1M5v jZBIc/CNHf}'Z  {݀zcsf3}P.֊Dv֞OG*=8& M ֗FS*zx߄+Y+ n@OҀt6dss:upmlk%Ul4ⶤVLn 9W>'$Qݞwh#hՓMf2n5QހX5/8\D8U $PF Bn+cS:!*)!I {D*Uk}Q> T+@@4 0b ^hx "Pͩl2;8^d Bh4s8^$8+$(lfɢ*=ޗ PE{BU* JITu6kl23z&ۀFb.j'%cpV-qI;`&tglӆ1QZ qifVX͆l}֍Ĥ \HZ׶gy@UJ_`84+x)ONRd d`o7T& *С7dd@R&#sI UVz.lOAx47LV:H=]w@9h%im$JFGܴ`P)VErIn j*C_9*'ed1nUt8Ci"X-Jm)%x!Լd38B"x.Bx/Nxk) ,=s S߱l$HK FyUbs;z2P$LTvtNGhN}$AIP,T$ H{*q <[}Z?6h;7 mZK*o6muX*e51>)- :0OV%pUP_Z!†ӄ~d74eHi|Sޭ Ȧ5eQIHg$)) FZ\v2 H+I}p{ibJ/&d0WOs ;`)g{[Vx^ojTJ%$pgZmr_;~mIt"H2TS`uST/]$ aه纭-d[WlF~Ǹ #Vr A\B(pelA,^2gڒRݴ q\II8AjlۍG%QmTO薼0I؈\ay1> i{j1 Ǽ7Tjy1Af$n6$AԷ%ȘPn6 [CӚ٦S{kEm J2zF3QddVizBV DW9t@0ub_NФcg6A"lkҖE$pCI΃HrӒ9?}/ vlk&wvG@ivoMq O-]2uyQT"~'xϝ9*FMfGPKs[Z @1bnMvw.ΐ<8AN#{ThJF]0T6 WHEx(ZCuh;XR)PU#GzӠ"iN{{|1%7Q2Y ؜ 8"siW䛞r S"v oߣZwn[[Mq M`mEc͏’mtq4j fz:tN@۾V zauIK84y[[7s o4ekp7BgDB ?>1I)=u}Bp1r NH΄ tE6c9I\2?t=ǖn J$=o ȽS:ɩ!JtH䀻NEϪnK(SA @hy:$"Ф_4xx2 Pf9g@K!ٱ&".Np@PNQ-A ˦D0G_$m"g~PMG7iŪW sNѥ+_m {Dg!R n̈w\1Һեۈ]V:zMyL[ 1{[<'!&J(a wCЖRhm~=Fw3 "qOiN*cfHvrwpPxCD֗:z@r;{~ }{3$%.M:ҟ&{PK:]IXěnR8BxrpBAp78z]货IT7[Ug!]-Ύ6Pm3q}S6ǭs0"þh%?7A=)BT8tVhBWUm-t.:AcܡYi廉WV5~3ĩ*-KI2 HP" KZI΋z _$iց)7wKo!BJȕ$m Aog;>C xTySN"v[[Rk )U/"z#{2X%X3vmH˝W=&˜4 !S Wʨx]*H%ӺGPcM4D­t@z^Om #A6$@%W!z2ޫKWFTPt7$Q4Ul;CJejEtl=zƛ;c T+2>\U*{ Gf'쳲&3b rK<,b?V5ȘⲦPJUFM6jARsCwC.sр wt:{.MG>&R W):%1f!#g2' rS%b=4iiq`(e0dʫl 6\ݧ%.X :CEjU݂bN5[qpۆ]pХW|eN *KD_$>9d'ƴ-E<<Dҹ/J-ݷܲnU \60nvs :4 _m'Dj A9!TyGEz[KWgkLNHNlG5@6$)g[H~ qMıIG?XE jIKs pT$ kWm夫!)g? UER"xb'};tPJZfN6AJk$VV%]twHPReU724yǽ$S@쥃ѳC4xq϶J2ҨIYh/"lF3/sP焂+a f  PPwӉ ~9B2E[Օ%DkckK'IYy(.}P7U4u͡&|7c̔ݻD͖t)ypIŨD[#X{v6U~Tdwfb120;d F&13aV>"-'A,?BNB& -(# W3IuWFMKT6q0KTO ޞߙ޳4}HUl\] bFIMߵ$4idQ?ʢQ $t*=%Pi#iMB .C%[ip<⌖qTp#K[JGku- ,^xiI԰~W J&jLbP[@U:^dͳ m{(U$Fe|݌ |A na84PRTm)%ĄA4n8ϔP$3[OeZd'9S(2$PLeOCDg~:TPMڒFsB/l;VohJEOQoދSgE@7区T CuApV\7S* : :>TO\ҮyM5Mq PC)]QwsȆ&2 "Zц~rDضO$xhŹhNIYT6"CKW 2;:Ι8Vԣv~~ *-Rs''{#ȥЈbLQܹ#%%-%ZergH05g*Ll]z.dx2/x~]ChG&c@UG-\nG[ddM ȕyb @mCAHy7i[ p2cw&I˸.e%_h:=ʱ}Ԍw f6ezA9S&F_ +f׉4uڨOZ H(c*Fv98-[ISQgӵNލosگ]c$vRM<3vцaH4]b8eq"pjtF[΅$o7ES2UNJ ':(Tqcw3dF):klivleؚ[UPqLfJse"H{35'YrveפIϳ:h2OPw>rjS{5mPA\Hl"s #$$3+W@; Z+MN zn\hoH'mwl膲h K$t@j=Oh <#*v1TksPF6Πc^g5ϠfPGV&Dτ`[`ޯֺNk3=s":⇪"I.*Juh (s۷88Tu@B ȶ \Q2 lkmHzz1=vPGW}X.yB >;DKuF/9)l| LApVBKIҦSDAݝ$mS IjYlLT+HE]umiZo3N{&ViyԹ%vE.]9Bi)a#CsX(d]\j]a1,& Q|kRK3nt-N>ѤB% MBJ0RYF8FhGVAQrSCLo`d*lI& m #_To9j$BZ$'T\m/h[qhh_a-$eyp]PHm% MJJ}?r8=l:+hA<5 jVS:C/hRV ۫d$ nүr9R(:l`SwG9EUt \: ')-pmТdoνvR:Iڎҗ"}UtNIf H/e|"'ct8:g?վ ](o{ rU@wFy@}k;] zRTX|5(D>I4PlLdg# AdN{DauB4WFөd M8hbAn9$vrp|U"IMkM֯,VѤ̂[~|x"X`3w;6ZRj\b-0* 5N@r>8SB: D("9I6H8s-ʮròf$ss v4qBϒm8I$cZ(QUk>NI{H9T:&0]".R,'tܷ@z֍_I#pM@T髧H͈a,L2YBɺ'H28 PM^.e)ݧ/hoOJ8I1esU;.ѹ8q<5xn T4fa|`\U5.kPvo4NԆ$weCSyJ j>" Po6p I8!>`sq槴P(eEzL5'V%Q᥁o"һmYiy֚:ړpM-Ql~Mj=QŽ T(b*"$<%]* *J(Y .Q`>ܜqmTq;0kPEQRfC{9L*{uլ+)VnSs{V+i >PTB Sga54@S\zPGߔ\ :c%hmzԳdsD"b S-LCs4A֯<:A&U-w8UcMp@W M9Siv?j*8G|tՙ39lAjK3 t\xnCz;eeYDѥ9&iEۭu6cحSBg р%as@3W4.𠾟n^wwZ;P#hAf9]6ڭFd;% 2_fjÉz0=9;oRÔD1f/ÆM8ڪ>;}|>?sW{D`etASPPdąr)9822&:=O[e ),m%+u` th#d#%5HHtfC}ߌs^s~CݠJ39`R&[ B]*'~ J$ } o@pŵN{c7`˩:-r7{P7Lzo9L}D^q>ML9-7ۙ&5)qqK`F kک'Q杆7]%JR7qBƸ*{(ƈQq=ښ@FTĉ\i/V.&XN4'v?$ևguPn~{%J$!gm/u΁jB@Е`NZ9Q߯6{cGOUH+w(͔7 i:R$_} =0Po8a26Lj`4HhLvGIf/N{$ya1t <608jM@>]9;{<"馃}aϪbJO NEdf1lx^"IA6bHw&9 )WOQ!^4V fi?zjgRE%zf8&VI 1NI[Wj^WA5v/Z6Ԣ"gGQ:t)' 4slIժ{Ao$U1ζ;hHw$$p j0zI 8 iKX(b yvUqf)C5 ۧ3 6;f#GS47Gp7wOjJh]8hq|~ |6Yћ\AGvHt9k 8Y 3QtD4Ѥ A\`n @?`]v&8M,XI=t@S ߀\W xA޸wMSf6ΧҰقw1Гp+@$LbLr$7U'pDg@:cQ`",s/ Թ'G%DlehӐnjp I=S-T $9ނ(&5/'Z <[2OYU>$/U>+'4Il oa9d_7_ #>-dx7U{PtNM Ș/ SopVJs^ι~Y9Rv$8-J9anqݖHIt.p{KDiHUҲiHdcf>}yoRU($oCVLp9'KQvϺdJ~ 9#w=mT#7XB':Ԝo?@MU{ R0 GihijJG2v˔!S%KJ-]%$qPmNj1Χš%w*|C$nO{̵9$ *XN*m9;˴wK(HBw N3OI3_sTF$,ʗ"WWjU IcH:K:@`i y9K:!O"*,K9b19᤺t30LIimpU 7^ifQR]Mpz %wtC3\Km"s J٤lOk@) <^w>FUQ(mjR5& *IW#HRIZ TITϓb!19B!*Z/hŃuƘ.JNRNݧߡlnc W|S! sb%W/+woH5<]-qIvdLV BF2M[I Wԕ$ByVh:B5}l); c xIjꔥQ"loI$)/qt08'L{ mx$iI poSr%iwrWs? 'W6D{J(1Js"5 \fwP sWr79w0P8kᷝP)oNkp^!e`BT8{j/ 8k\B"ض}"l08"hV_ҹXw&Ց![T. qi5# GuO Fo&[F?~ vwoD8ᡦFa}PP+v$u4@@fs`Nj#JK)u1e`XN#a!we{tA]ov}`?#N ۙpYEC[EA\YDH*hvZ3s kSҶMC@Fuw&G-0*\얈IS{j!|6:Q#2"'JWG1Qjmv(oQ ʶhAq&-pm+KN&HgȿQp7"x+Pf]*J4(a@!aJN%|:Ffj=YsV5BS/>PUYGΌfF+`ʿ`e_<RI4f-'& uv䐙3E,m60NMM z2/MnfaSgLX鳨dr*WP&.]3+S(Ƃ' AQ&3,sԍXqlC@D]u/3"uU2:>6GokKA};?I7vT(#WT1u;,M9=Rg<p@(g)lML EtG>RQrmNo/Ϗ~+mK2M^!x3,ksn|&|lۙMVw966okP Uû:-RAލ aOή  I!I{/d.Ovui4V#$$v/UO-V8| >#r#dB䲑6.Tk iVQ: Z6ۓrP\JJЯ(=t-n$s N94%S&[Jc$hUkf:PS͔H"NA2WōwOCM{6HI|Hgȼ hϔ(+3G]U ؟2LW@~>XwpΌ(2Nz ]t]Xl ST+D),OȀՍ24Ex*AOQ#;R<\ ;n6 TNN]RŻʪg7@TVq7M,TKHj:9#g hBDQB6d$%u $[Hp^TcY `_ҧKJoVUqRR%4m_Lκ;lL r<ĠoIpl|3bU%4RWS9ZV1 ݽNeʟIXVԒ awhҊf]qgϨf茜kT"$wW" '~RD9g_m略j}lB.N7Y5 wjOZ?8b4O39(EmU  PAAMDx3|A$>?sR+h н)6O*b<* (* Y#'jhG;8n[k$3ZN t&uI[6J%NVTxNS]sIK"m<ᮃSi>㟉]wړ;8o$&m}%"D-X/ Lue`}GY7ɊVcjQ _AVKI6oU  Q_CIvUP0#Q¥]θ$RIzGުy*=Y 6$ؿ S]:#ڪEP#!F}6d(ΤF7# dq\@A{hBTQ%TZӸ! TF,R@r1 |pRn%#.:G/K-nvDE-I[I7'܂ugyDH*bӄ"Gth3mXP$W3&, S_ lV  U9>01"oi?uA *(C Sue3\調 m$ŷ"}.EaZ(E JsG99'p`2KC`Ov{|6a-5P*i'IFހ j_󚠲|A^!0ɕNOڰ$I%޽uN }HvP 5?wufRsrN6xl2fL>d);dD3L5*ɸT67$v;)w# KNUcE.M6:isοuq(mS"f,Sͣ3d H)}ETQ4pg,s],Nv[iClnkB?Ib7ML 2_%nw:HcBZ%RG5溞b;Bދc 7%t2|b "*qsAD\SJHU2u*:v&=% i69"rГ?Kߛ:<v$:N&9w*gt~^-( H%-ArܻFfS whP[RO1i}>71HxUN쓊;l0M>o$}q+#7LWh#G[U/V``Au~`ԥU+_ #q*T$%,a"}I(, ̖; )n|eI3h% :71JRi"eIPiKqIENҿ$:+qS:6JnӾɖ3G| м4. DneLYL564^{' ajWؿ1~ꢔԈM`<^gqGyEZG:PE;\*>HQS$e[D;}9x= di O u0tU6\$OnwHᜄ6sDhsT~ߕ sm;^ l8bpT$$X׏idMhw"{sRY%p>#2=7f"^LMI}oyId;qfވ)xĺ Ʈ&z1 d}!ʸ#t11288emҙWG ]|'uu|oͭۻXv| $@nݨ E>U{G#i&ΔAPʔ4ؾ 鄡ߘxAwU\վ ICz.y߀4hptRE :R#t.Q5h%a k ꨐa3'=Gz.ʳOX'M)RXѤ\NU>]g2}؞}qS"D)5I?qRo]Uy]iݜyw ݒut@N5xѶai 3llwo]:;جԶU&6IŔO^~.%!&{S əiFY@՚wlF7=dvz*K j`i SpʐE#T ֤ڜJOJvtgoϖIRip%s hC2z;sa l#}? 7!X6dشM/3twX$rFpL@<)[;Ȇly ;2}^Txϴc=iV?P2'&%tj)SAQQdJ4O-Fh{Ъgn$2ع܇;&R`S9%G,]"-S[IF=% 84wƛ=)gIxC؎0٤V!;lZ~3y7tn"4'Mbl`'.e z׽tb1}.w bD8$HHA’3QN56 [baٝlэُ4wG WA zngϐ_MI 2Il)^ttnAn mSIneλ/8ĈM2M+L޴uhn(z}b.(4 H29 :32LcFVNjg}CQ5s/ٶIg+EL't>7k%16p!xL[(Ք5,OPw>Z%V݃]=9;7,0VTK*$ ϟr'U}B:K$]@;}gB\2a3 2!ImZv`Ir*ϴ}p5^4O -63g23v<͋QJh:lWi#B*k.y:+`{2ɠ䲞[::X~LY.Cܖ4!j~S6Q"- {7 ILU-amh`aMUY,"KW`P +rJ:K(شC“Z vlŠW@VZ3TNZpX KEASy(~9ٟVe}~XPp #11a=&cr8dwHx 5t*;{9 Sy ~i6  Y<%d֧g f-Oh -ŻQ^ûl,& EZS&Jv=6cq ؑǪD(VEnR0yZ iĠoe;r`6ҺCDvMfCia5EvdR/Itv@26^Y~w3Cg[Bk`$Oӳ'TdUzJ!+Hڴd@Z;\&hZTjl ^kW߲joO08Q}H z0i.nWO!I8'-S>@#@Qu#&c|Ny˻"ƫ3:b\UN 6MɬA'dilUņoPMXNH V>ՄJ9QڶNۊ{H&=Ǵ/ڃ OmSOllXhEkJ:6f81A#|Hf=!gm]Efn )&47hM 3ZH{ dS1]2'c7TNmAIӉǚD@*ӶbUndA1j)P:a[| ̒IL,P:ϸžx0Rv =}s@jJht&'1"%/F2xf;Hpt(oZTXIWq޶Lu.)ƒٖ)Mխ BD P^A@=i+ovp{' b,@یR@ NҞo.7LrRRХJ5]ӿ[x)z:nYN>^e:\R# 'N.Qb6pOJPc  4=AP5p;m'AHl~)Y=ġɌ L@9It],i& ݌)6q3X{Z 5xӐݣ -7tPWyuO ¾E]^\A秽d%RNI91}Z$؉XYCӧX6D<'LB)AB~)y'皶Ƒ0"&RD?BZizf!kMڏ}F'Ð"S*_s&-ANiy!#zC[IcI43 > 08^8쀪6#Đ r-пfjL9=)MPaD{)fdtMHJᭅp \W7-pS&2H_;6h"DZ;/ "Q3 PLx{ͤSzOa /-Ie{rQ 6@mOuBMP#HdhOqT:58Y][≽t;:PdS -?Vk0zZHbo02Pl 'IHJNw4LTj?^+8LO<%)q>M4Z.۠}dC=p&ո ۓʉ LQHca (&3M+~@ ;Ks2t&:%;$7rDa VĨSΰ“VŜ~[YM\ 80U߈R1nխ ! \\#Emd(cieo;4,HwIQ-aFP3a͢g$x+[bϢi|F0y(#~BXiM] nLY!F\jQ:Em)s*ԽwX[,MDc *5V\J VkBS >|V*2V 6&A%ӊ ,%<ܓS02m `6P`m pTftߴ'V5$Y*lU Za܃w@ blI_9Y^HvblDNИO…+r:EP7ط AsOhi ʫФǚΧe y/0QLCMJ"$A[8+hH_S.1Koç 39 7#FjtL-ߍ{79I/BڐBAm@A-Y[;6@StCvLgƁ^)Ӆ(K`8jZ.^/xs f8(ph/-iȎRb=%5*x'Ƴ v@9e!A-EOwIP{>B.t6jS!412j+&ލ흲;M1Q;IRB5Ф M; Pǻ>tCg gwFtAIw_^Tr 2IHI$H FSu[bIiPi p9A'F2٠!no:'[iIã4"ô7mڢ$9$A2ZEzC DtsG*k=&c -U1 CKF`ALKݛ*FvR>7-)JsG0Z1>ǟ\ɶC-- NKl-{mͨ⽴t nSX}&_jl:'bft,A&H #c("cGiW3e؎o~jIú<uREbP[ν-P\]D4Fr"ma$@݇s4 * mm.(9;$3TL))^ ^掦T ;lp1$M 'i;4`(?wLzJ}h~hN:I0uT6xԓc djp.qx[QvSHWqǻ]<`o;? [sdTOHӖg2@dV.w)Hܒ@=942ݹ# !ƴu&;h:a95a wVt6 ߌ1aYNyVY>nozi˹D_ Yiiwq=>$DdDoaNIͪEUۺfX&Y [@Y̜~`$]r QwDTANA6 팦gt-zT7mޑ&$ѧq=# APa #~ʋr!6Iߩ='+D¶t(i/O1iI69$iSQhbgvMc=_ MAoY4lK>;it"~9+4x<)QR @u363h },)f!UH`2iݤU],F\OYJm`Q@ qd$+7Cē^dnrWSGtԋJ{9-_I'H{[ ]5[IڤVHJ7Hsj{NYX( OUO]=CY:0e tN1f&$xc* =2ܜWK5O_sD}H͐nq'H:I(iUBxvigIuu)N:KmO'YL"&CTM; q8SrafI(5aɘ2/%gHӹ$1sgtaeK%'gڶttAw%HZKjpm C 4lL`'>*i%-"a/Ih,8M@w(k`_?_ѐ% ^zDҖL/oJF~7A zr9&4YTkkUy {c.Iqͼe}K숄l'x$B3!UHgL'3qo me)B\TrMjM@N`ryS#iRkxFNķ`;iJ8~bSPwlDGN϶L642 1RRMLѰg'W"8MU:s:lj#=gV2 R .ӚY&{o`*J`nxDcӾZ$ WJño$yLUoaKԢL+^$Q LYә]d>%/fS:ERK7T0t:h|>}.m0o)Aǝ.Oݣ"srږe[d@6K )&6PX9ʑ rfl\8{sm G ]gq9Ӂ)I [f* &PrU&g"iE?U%,%z)BbvJ c;j9쓄{rVeirܝyJXp%[i@H,L+8D*g27?h&EnƆO6vIJDP05Ust0}zMR61dd̑n]*Մӊ8ޓsnII(*-7/Ϸ߭ ~>~:jNNwv<$m 0]&ߜDLDˀ짵{;KԂI7g].ޡf AC̦;i*6b 293twCT0a6߱ &b>hVp'DWƛIBP䡫\HкNmLB 0.pRlK,+aZI/1:>d'%$@'ѻCƺI]2==}0$2Tjw7&hƿOchIKA4+C0Aа7;eihPAU_os Ecuj%.cB-uPSz^wB[ "60f̸X&rҵtN[o,)1%W gZ#`|?AI3[$U7mf8b-Djj)'nbQ5dɴJg?K$ˤoCt58p$hHt(F}t]aԳ;y KV܀ 1JY cR&N]}/~*&kک.]{n .zYЗ}[8+vpׂ $ v Tos"=4|2OI Gd8`3~R$: 6`#_A#[Slh:XP)S qm@dR%89y}Aη}w$Q]<ʘ5#hIך+iH+.80uTЮOk-w5A)q+\S^`pW?U(xcX2tvt7LLbL)]u)Zb\:iQ8Cϔ U/XQ 9bXSUJ3]Q!&S.mOd$0T<.1@'cOXUlFOѣĴQM 'nTsʱoTb@ڠ|t4"0O KJO=)-|kkhw)ԖOd|Ɲ^<%![UС6/B83m)^eL e$ީJcNzE[6I|$A Ep&`w$ KU&\)#A I?ZJ`,T`@WJ5|AџH}J/3FxJئɥe!"cr@4ٴ:U6@^*&r4Ιh.DkbH YN7b Yp[O2SӚ>Ȓy2v+}dVȲwxiY8NX 9D=}:`|@2ӊս7ģ @ޔSug4 ^H@_ArN:;f-ȶvs9gDI(ub; Q,v# Y'ɗ?ܐ$ob;iPE>$v>k֔kB-7[PV̢l7~5:>$xUBm,q-nUFNȦvRr:u$8[^`vIM{R+1=NHLvi;O}f$g~JIL5c*Tv.sMR&=aǚ  &$}];#?P]oP LI]#CܴŹ;@FloqACKM< ;`b JB)=id3n8 7mR䛌eeWbJ!I<LYv ߠ>ٶ: ^P'GfKȕ8SBhʻ6i_;OJ7rg{h+Z%-/KO&:7PS9is8 %Io5,,Y; A1@[,l3 2%P1$FP&]y#c2+MH& ;􋠟Gipf5<9uq;ZPܕf&/39fUq3'coհO ɤ=oA)NA}䧖-l*>3@0Y|}!Hj1yv vж^N:ETB:^-d|[KߜX ?KйayV$|-r2qЄ= xMHD&<U(m$9Iz-bLPCZTtR wP6(uozA[T%3E]CN ~?D~:oסb UC 8AL?"6a\4j„ XK:I(ᙣ˔T4`pv <M Or&XI:(k~C%NDH5AAOn-dr$'F0hWonOdvRNYd{G6:eZ`IҒͶ`ȪY[0md[HV$Y>/uwJ=.H7H0nf}N{ ;NxqO<ߤM05,`pNqSc?9 pt"* 9=wNXI1iwe7}_TO1*?i qM iBZ.54_2j*m_J)x,D[͖_薶k#Lh}OkoQ€c:8(K.JYO Ff-:m<тopH V!'̂c`= fəд\"khʴ]~:fX5HUlT64y ,/mH3 i%q@!&;|Hw2j!`*+iZ9Z߁ y ~wz[&ndHjYHU2{WSj'd_~c@w0>1ѳ9qQ[cUn0}%E/E#|J$-6Ӟܔwspӹ(yocrv<'/BM,zngR+MɹN~~J r4)&q$iINfjiTFC왠OCN h_v yZ!:^U5e&~*騤{HbM-!a DU©s4g5PԭSe=l$&SJtFF(%u&X֊u('M8JorO,G6شmR%ҦD[X9h |[& %AM`؂cY:Mvn"ف4ؚ(J^HlX5܃@ ӳս.gyKWU?_/۴>nd(lG~;DɶҶ&gK&BL`4-EፈiBQu!s jc;=m! {3 tL7n&#dx?%Ak >gZ Kq}Ar@V`l۵'+ğt7&؜4|8K$I-1:#_3IZ'$>hIs$4X4bgtΩe"H JTW2"Q6)JF!_`)t3#N)ZK~Fҧ肐.H*tyҖsY}SWÊTƤIdlBl j%-H@Y4y7 $G)J vKvO% i2@п9&* U|tx ôŬN>q6PJYצE-9 EtlF^OT~oX&HqTg_EˊcY5GBcr 0~d,G$HgRg5M lJ 3g,įoq6HI mUwO$X'Swdϧ$n=U>` o HZ^Nν~G|49!xD";>tOov $SuIAG'$C&Cs'A !mT?f7DKa&JIm\J"0؁E#,H ę@ dvmJ9*t뺳3En(K`ͩ4ZM-yS1Uߴߺ-i;Hn^jH,>yZ_/K6|}@VT)ilNwiL?=np6ZJ< 98W14sl*c,=-(N)BGk~5Xbm9ƱSLMǸblO,l ѥߣ&)`m+Il%ddS2B+m%s2a|mRrKrBn1^Ox0`;UYRsbcfԱlvArD"; MzSo$e eSkS'|f&JP`C@ nN- $ u;:t:&U&:#l__"X C[j?'2loR[V9BfwVW-l">!Z|d+ycۻ:4 \.H2;*8- ~mqP]lnBHc᭡Ŵ)01&ymoR:i$Qm<_$9h@~+NSVu kAE;tцysM\I|8S6 eQ,ute:t!r6Xn du}OڗvInx ^&:E%iK>֤VD{èAUZSFKX١ttVq7lN裻~6Km0$ RZM"}))vߴQ/|Iz\'ζU1r2C>sw@s'B&KLҩQ}5.F`~Qn솙_-1[ 4x'e\A{^"7P _Tp6Kvn0"+ ā쐌wW%~|MmILงɀHOq)(!I5wyAT HӵML7fT0@E.+&ƿdvZ5MCbTn=V|y ׉[ECĞț ?Aʔɓ-0Q4IJ{gR*'H :n4~~#m1-3?K!MKvhƙ& sRӬ|;iR1ÙH6 k %mA 犊 zR}ҌY̖va`ZOn38Md8'Tk %! q%M$0>*;F 2=:%Qؒ^jBG9IO]D#v3Z"3O8e*, u Hm+NPW(3y*gX̪\?|N`hA+ZU,HʕtG6ihHtdnT2z 5@ڒZYl4$ʷNք&SrpG4a-ZV I&@lEjaXԉe5ju|*YN-9LVgR~4OAIJ-ͮLe Ψ.` 42$yjưrBR@>a'"gI ]_= =lӤjzvNAdO6hD|2+U'1WI9_h+,=,%>46.Xu~Đu?08Λt:YMt ꖆaw} tAA֘Đ&?Kꆑ!IA9 fI']7@ng,L"~$5Z_K޽ӆ쀈R&6J)WyIA*Y $7$ܑ $x6:?t n֧I5 ԔbԻ۽_30o_H>,0m tBS6Eoh RJ [Iko=NAXOQN e7q.Gxy_COӠwNխ: '0_4О*X$ (U9nyʵݴ,hߌ4 cH폴Rx( swni@lc4h@'l`;Pt~l2~j'I۳m@JIO]$A- )MU_ CH&Nt/j_La*FPPTT b5kӤ! Nio.v-L]zjBZ(!nH AL(^)[W 'LN F$&K_ARiϠO Ы]s<"SJSi=^RL q1177w'kON,5H#UyAO_Yj}rB8g]:E'@V BH{)(1[^-i3PC'fxi[J/z>:R#CᝰfD Y%$T/D>rz )rU =!M`%]Ω8 9\pdO *9 *FI[L!?ҪA(?v t v!p"ȘQ6_ y#TJ.v{f) `*pigI¦LDP gy. mG)AߧIdp#DXug[1J؞->@Iujtthl* ["hE0NSGZt^bWBQ&Q֘"@-R~f>ȀII4}HDI.,SUlaDӻ<<3%M{L[`rj57ߣ-25q1i.c@;i F{EZJۿ89 ?wwϻK **ioW ľ(pviKP.o?[ s~f7%j ߛ vv`$}!!$ #ϳg昦AU_͙ *Ton$& d46}%m` .ϺGփA#s o:E:Ҥ sy7֫@X/xnuwV)Vt@*D JOjPJBWx|" 9.4s{J(rJT x%ε9O}`#B9 |cT5ߙku13w [gJꬭ4 {hGMfl~aÉa؄b QҤvhfG(5(mOp Mi0.O7iNScջ4qH-;`?3Nk}Bv AN8L.i$uRaqBIh'Iuo5A['{cr7<{ o,q_с_ 2L w -s}`R챛čs <ǗuYS:[D+fq }ul]ҖOrm5v۷XDhz53IrjAc  IHٳq:AD@ zƢ7רѤFn %kD}=@$4SaR1 a7J@1I4ZUrJ{lNȮg>Iׄ&Ҕ~*:0;ק*h-™n hdc&jeLW $"i ~:bKQjP;NBˀSQ*bȠ7LFt-pMv%z}3:6DŔOIp;Em7Oh<% : 7<¤M~6!LL|GS*t<ͭ5@N#) y=76/VFw5OٺߞK=da'Fh'4-Op!e}ϖߠT?P.HH ;ӠMb% fѿLrn8N&f _rJo|| tv*-)%69 )Mj{',f'*FImjtwC0'L`7LV; ƨ\&whgn veJUA^~ P"51=ؓl^ү.YIlD"@DDF0Vg$`*!X|@Pޥ{<Ѿ|ib!)ܕ' ]7{JOld'3ijD$0{Lۢ_)å9DpU&RԸ㻻 X%;!^_ɐN7u&3){e2V1x2,%iVsiiƢ6 @,ci"RPjB~ 1MwH!ɼ.;wj#P.>.)Ka4Ir '|+jSM6`MJO?/aĤfaOzY3l[W֔PlU< LʜBfh@*F}h>'F3ܘ~nҏmAgqt ln: U.Jdz5@◐D8 7bipbh_ʞ!?Yg#UESy*.CLfhC$cchdg~RPIiOw܀jcu/ݛ`SVKm;UhD-||g@XG`ɤA7m;6 %A$p2oX3.3{g &ru#MNS^ $8 8a'vMww)4_=HL^i8wsPI;[ΙkB9;a;ō٧yƍ9آ ^QzTSIdbִb)c*\qO &M}럧X T3(Yuhz) I(n1T9=)ݗYzQ̽-/iM+X bz غ8挒 _7{# J3T穇:^D (GwhUs}ds;fh/3qr:cxh gN kfYfPj/U)!$Jʛ!)[noͺl3|9qoFkWX!gڴ^X'r7 MbS^s gC*`P0rw1QQz&.x 2=;ر%װ37~K~ܰ,{Bf mv"_ndZ%ۑNrS熀tMDA{G.F1 {KBaZE&,_#9%/ƄM2M[h[ςX8GKb$'m'Hm %%ElٔV@ Eii%g5ӂKB09Y%g SKRҒ; wݔ~o"gP*v.43-!bmxξ>~3r.o LӨ{OYn{ .fi0ąM(Mj@DdX Vh%?Cߝ5TT% c}։1SOӎS C~c"9PIM.I)g&pkeZ)y6T4fkV+QR03)8ao0؟'&O6MóS1j~.DwHfĿCR)'ʦ>*2$p:9<#Gf t-CWucR $[tF:~{ ^0MK! Ʉ7qn 7؃jcot]!lod3 EmS7qD.7Cwy*yS`7Ou402&91ROvF='oLg[Y` f-O9Du||: ُtWE&25~KPևVQl`j恦s^ Pڔl`|WM]Oؿ 9o2`LO]$FXĶNh1LO ٦mA>yBDj2U}:T&gykP=X4&AIhOf^L;XǰFYZV kgcG4g^HtXws?w0MSM뀉/!!vs{Hf-zK,R:RJ^S0c|8N)Y`y{y$φ ޿ؽg;ɻ_\j(m/L͞1B3VQ'snE-*NqK rV;'ߛ"FkjiW57ӭ~Yn'ٔ0MYa֛_JwX[CgK5\FMTo:P>) MJmV¥m=:&6$7Խ \BCRekelX85Hh!|гKZ6Aj<'Eam_Wu@XRrmgܜg$/EmR4^7(/Dzy R)Ms{`H>h!a2b.Il%aMmmzJ=\Юb+"4 nIwX} L)F;>i+"1,_Vyb8ᒟG2E60gt2nL!R~u=Dɬi?6$=7 c[n8y [~-`̌T4&sim#1`?Nv(7wI% >'%#Lm-MA}Вw'ŭSLSܗ$]p^a^fs dz <ӉrW_=Qud(}+uAvHNCC'>f[y[&=;g"29o99J`֙ ۝ZXHO*\ gNvb&ACnLeP&$ QXtWc3{uZb볒 { C jYsQ71wx껞\HIdHΟcF(LtIKc9$u^a4!ւ.砆)TMI@X'>'flD+]}p/-h&]C\,=Jc!U% fVjm6 H1H#@]u$)>ei"=@92fFlI{Lv"ޢ#ScN7l :uFHV~:ҩu!dLv@sLӞQ;W2-nm{f,رZHXvS)߲ӡStIF ?$= m -` A`iEL(KuDkKٱ"$}ĹF4% IAg6X$1jJIp>["W+O3aT6fFSTW3(h/i9O.W@n٣V6&F2L*lR)SBQ)KY'2$%UMyu s ><ڥh Ly5I儭d[vI e`+aSL"Cp @.XV6Xbz$t9РؑEc76)Gc7aac[?``[lRHRL& b])9ѶDg.Yt6]$&u4{]Ü|ѭ왊 0$R])ˮMF&:$+p2A?G$%xqӊg)YKXO>srd/1C q5y2t=CӹL>ī,Gd>0Q/p995'2CiɚO->y%& kLߑYX&osR+~!S=?ݐ:TsҊϜo]|m e-9)QIڬ ! ^ӳ$^v)zhʷda=vCἫMޛ<Sp $OxcٸsDD| PP*H^Zz$Q<Ҷb*XU&C;T6vѧDאVf6 R 4i""QojTڂ@51ع|.xX EYw؟ua&sϝO}fVgQXvu!?")`YkdufJP30% /l2C AgHC!fYC Ů>A:O/)UE/64|?0)1rD l Y)i,S)w4iYSV:7̓I}A_Z׮2Mn>PBLi_TlLմv{4v.oAI$)m6Y XidIyūa#4\P1>c|Nd%6cJ3Ϸ@Gg:aP)La 3Ƃ 2ińVIIN *m 2@%AYuV(<%vn` ;W} O :~BkZnLS`$"jd=Lbĩ̹JDA?MOiR"~vtv fxRבr $ꦻf! isc"tݻ$YGZ !f?={{@'=)O-y1SRto)!۾rٟC y7Bo2k$˲MD׉Or E6%@bA_4<-4aJI #r8|LthIԶպDim-FZkMLZ$:BYN?Q ߕJ٢eqEh2FہĮS3A@u2 Sr{9 B7MP&  .S΀#$9'珴}\ǒⴛ =}w`mމs1IXp@N# 0`h褳'Y5Clo{v 2l44DEz1DI,iP fYVs1*hwdMO nweJmbsLWn;dOSU- %0I=MPsjºuz\MH0 Tojizo6'c3S0aړZXפnM@e!H>"0$}[)0wkiM?UiAu.-^@L}qi%Om9,0EGMx Y"8i0xPN/C1;A(ݢL4o`X Um& ~K/{3U>%85<,П?N}^bU;@9HeI[ :oðq/xSfS L6P&?1Q>jD{NGɾӄAj" ]ū-b}H{b.irׄbF wotv:HZ| Ћ+o ;tZ))wĠk+$\Lĕ h$ Zc{{tӊP ͠E ^S'Mm vOigys|9bXEʚ (/>a]ft8 HoHM0’ϝKtTM Xh;4 /P&O@t:] 3E$i=1CԡT-dڳjևM/::vvg i@]}L@M$3]ɞdhJܝ4dm o M4axMKES!e{)-kSmʺ4y&\F :I'HIXqfx/@ȥZL)@:C`Hy}ž lB i3SLn"g;= (aSjHMI"fgK`$"T uzI[=„Zb6#鹌Idny. 3 q{xQH}.Biئ٠CY74PV\+9N-N0жu پ}2pn9L:`[.&)џHs<_u 塮Gxvuz* +/œ f& 6˞S e1=mwg %[w&/wVؠU nsw+̐СӉmpOǩ ۟4d wX&9HvJ)y@QkϮ9֏'SelJSF{X_>)>|Dt"l`r"t7T}J4%䀭"FmҷOl{6R ꑄV̸V`h( 4YKR JCn)j"tSNISCP]joL I  R(a2)'r%*!0'jVHy"GTtSc;Wi,d<"gAEx R}rDF|fԬ'T-wMh|NFx["|Ä|ֈicXaNϫӸgY* =5=᜽_W[:؝fBDeC0k9M3 JJ MKo| #}w~M@B"L9)n[I&Ŝ2gE"GP`6V]U W 4l h\"ZfAHeڟg} *Fv'MG8Ղ_BiRK/kR!&woЉRrf$sE)ܪ5t-)7= Ɍ&;U` lYnSnnH;3/[`oMһ\zxM6t 66$T;%%r> wJ OvOahBaKh)j pR)l[)ɮi[R'9Ĭd6S~mC&R]@R'UOwj1-'T=MkVv>ǧ5{1MLe:OaN>tPG"UO}Hg_B@ .h0Ne- )X`hFe2QXrԚ&խ ]NNF.\I/%TJN|?>Yp]Y 2§ҲLLxr^i&0?5};Ϙ&tG]@|q2%6:פ{nu+kUUJ;>.5 >/j@'50qM{YICs>i{X36ٚIt~$[<'Rlt%WÀf 3۴Jh@D2/jgW worga Yw'eADy8ץ"I蒶'?(QT 8| ĂFNPۖ!k<Hj%06wI7-Uيym t Ē3,pvmG+$$0'0mhTiln;> 9_B'sP69)b7j]J;;ӝhNc v;g*-mGH*_zn͝ \.838~ˮ4 IQ{ 3>eUz.fz3IJar |i?Zmb3ԥq&ưn_l `j!OM0oT6Ir@ؐ⬧dW.h@Uy#qNMԔ0 Nx{z FlcHجIgRBMW&=U,m+9*%]ǹ !qqLPЎ倔wlM]=H,p>%  ; 遥ËH7 ¿P\ߕl萵4)5$U *3DhF!`uٷ*;ݤ(pȄ\`/S`ASͼp {ifl*niǼec$}71TN/mo$d9 .:fZ6.vO\^:y y d|z=IݠE_=EtJ)}Z({7ނZwEUֶ7VtHY璤̵L=.Ji˻i=sKn&?$n$*)xlᆙ3}L\'HjrIR:$㖎7֠k"Ĵd`|„dTykJiwBl,* — mݚދi Ud&" If 5* :ҁĶ㛟T7.߄ yZe!L UQCϳ"%;A1_޽$A'~Uh{ O=@7c_O{C0g-{oh~ D iO)=nگLfaA0Ni`P#cH]Ҷ$& -՚/>HD(ղAhIoޝ>" lZOܪ^ 2=Ӗn2S`dHBoXfe&;A]gvTU-3/Q/6-X 1ږ gv~@m ڢ@I>[U_m);*[}uM{ S $&0L6;S繗BiJpi)zIciԱ bԱ;:na{E+ՀJ`/ͪA)To#,0^]GQtMDA%3 ]8ZU4`IZ&E{JّPb] [2#b7HTў|!!~rW =8}?g@tj!w3 yFݤ^~.wz;M:/q4A]0!vtgwcL!P[N:a4ٷW4dS@; ș(ONJBK?U0-' lRbbw Dݔ 896D))L07s(isd\!hA}FDeKS;} 0tA9Un$ݑbQ g$&*W Pтf) uIHzXbi\Tڪ&&xr ri dȒ%$8{k@RXJIƂAV쾓|g k5(. J;E8Sr!%=KỒOx MCKpSjv[&$0Aݽ54gklÍ~L doD'H) )2Հ> u:xNmuVV^>sCP'w4;[n)YMKDSZЎ<)?v8mU/R)ذ码٤KEzo7{vr6sSWBvHJ LתhĀ# Rek_o4+3CHŚM>쥭d˶VIMBiJLݭ>-$u珲F% sb=$:Xܙ-Ά$qU-z,GI TOSZM~6vKF}ūPkJXjM`5 @R487ɸMRPDRb;8ҁlO4t~CՊ?7 R} N-";L1BM)OmBlդ>쟹 |p;mpx!Ə rA \D/$+ݙuR%? ># u*>|WŠ7ۢݬD8Ӕ<`eG-oɟ-q~o]\m.O }$Ja\w\';7h,x: ht$^Q xN8Ύ<hZAe#r*'wPtj.,ERٽWi[ RH ȧKډ.IiChInMjϤغPowwS &%~)Gly^luo,m2){f&LcL '@[5K tւT,=<ÅJ05AnIَf^t\!-ޕ*<RZTODpd?5-yϢ>NXR 9;TMSUtڻ}T B " >Ogbɻ_N39&[ҎJPi>5#Iu&ɉI>ao-i[>0=!J(`UO.+%Ĉ4&Fc~I &"S@[2sYL]rĚ!E2YOA^_h,$U~[{o &z왨%/PQZA6][N)d|z]$>6x7+$XnE&LF !)pB绌5BTrzvπLjY_\N=ۧgɗ?{YfȾd[z)*jD!! di1u_́Lf(tr҉Jz72 Gjygػ|Cӵl6ڥ ?"XnJd')I"'Hy?~6M&[fmNaiPsN܏'S]:SIC5ZO.R lt%b;@dV Fc?jK!']T) Ug:g$Ҝ);5#M)NJTv `f=#u $?r ǟUEO (iM†ҵYS%nb4cFݼS~VuoIgEkhG&#'$!Ո v`CzHm&˵}I24 %2XqjpLPShb O|6 \;F$#L@r2ɤu#4U֋C r$gT@ޓ$Ml?)M"6HmҼLl#tF.cb2Yt/UՙI-YG'lFm5 iS2*>pD"\ePNm)2Ɖ8Nzm~G%d&p':LwdOp=^;$ԗV/&¡7BE{ѡo)!xs[xjg{`r`fNi5v[MD- h}F{u,ɇb 18gv5SYەF^$nSE7HV_wI RhD@טS/ M%޴!VՓH~/%9mgQN?nT ;_jgb~4YKܧ3s(VteϢ3QY/S 90'j 4ں|,\? 0EL%sSvujR3Wc,d>/%F$}|Wf #{O27(*)Cf:5'678x)0vzMIҔ5s@K+9F9$Kq]W]1uh* ~EofޒۺHӾVn*# t`}óH-(eb@mn$liDjsso` ccKfob.{-I9ˣooBć@dלcW=YQUfnnT;%hfL.u22c&'лnzro:hUUciFtd\ oϞ;PH5AĤrnDkCjՐO1nU^^qf-' O˩<(IB_V)!Hݭ!]h_** QLbMcj֕`FwS#@)4f[8Nz?AdKַS?K$ I:Nuht}}˞Rbh s+'k:=HgZdw݇FF&-?<`l=~JN'f(AkdEV}tN[ uRu Cs=/8)JɜLb5=/3OKx|>)B֪;= ORIOWvR֘ ,L @h|5HH&kI]\OOVO%^II7w+T1t*F6@o[u&ɬP oAqUJ y.6@ʄl2BIPJzR49Ͽ8=Xv#FA2CSGWu 0W)1Sw8ڴer[* O+zաt)%ݜOs7K:N;Lh0:HbWb~u&l|`kw2j:` 9ip hG|,V52\=0kNkEفUVӮ8,5OuGq逞fmh+S\q7yNDӉ?M\w hϞ]nx%~>G~fv?I;toR"Jq`WcϙLzI!'N] OBXe_ '$-qcDjKƛ6)׾m􄊼:=u&OEq,ǧ$ r^бb\*5 ٔ`<5?r 8ei5`(9iv:JN|gTsx@N顤=4kҵc%=w SU\ T߄gA@>ND:Xl`0 |^-bfS@̇M9^MHͧV:=dL`cM߈d%H%ӚY'^z:KG/n}u'f%ҝ>}L)Z=rZIjXZ5xVwHaI[K>,qU t~WρS},(\5I"5I#bbwOz`)Րp80>j@NۛH |O>DϻϏӜ.OYcF{wj*{C<'쓿M|?!tx HU&'sSɂzܓz%?ۜ:]ä˖x.F 3^1~¿߰ dv>0^ M_s+=Yt"c )9iG%b~?/2D Od+|XcOHֵGH[R6%o{`X1T/_o5-e-8GxCVǷ'BILGv 稘ےņkRbBڼRkUYTP (HF 溛D\n=cw[@ N26bB>(H[2iჱN?&%nsɛ'2ڧM<)5FV 54fQ|/#1E]޴Ďv%e]ǡSWsn臟YӴ E^؉JIs' B#C˝}5@ʵsN;Nũk.9k~}FIÉ!9(HPnSVSA Id3a*g@LLrT^j=׶5}lX3iKS}oU0~:تyz^b.8I65YS2NU}rϷYrMw'IWOB8h >,1zB_ʒs9ޖ^{ɩCaG9N:T&~Dbⓜۖ6;C!\|.Chr7X=1cl[Jqu~7#o0$~bbgwBD2fO"O4މ)[2:ݧ[ فO`Rӑ>uN7dD|&d:"C":Pǐn ;?3&BNt{-K{NcPbot;;% 7J#&qL?`[Kmb\'=އ(BE Vx`$bxB,Nk^I<͈Y"e-i 뜌Հn ΄06ɠ:cm@NAZ6OcK0hPv'RLCrHeZN&ROZSa5ƌ ;wv,VE@pzI{H9$^s"f6zSb*(O;nMW0 jE-gr TmH4N@@YƭeR3Ѳ<>ֈ$`yы[-i2̀TO;I%"Tɼ {y]Uu?%zWxb֙}0f¾NfS#RGSz'{uq9sv=C/"5 P!+5- p'56i塮U\CeMFvl#؝~Gxe7~QS"yt ĸk?7w]y:.fFCekt5>YH׵7}->}߈f.PQ[ړcw omܦ鴨ܶ)ƏgROx'dwnWyqxRdoz'0qB9ذdT~WxuN`;ikBg ^%mWӉ6-vsxu] IsVV@MJn #2NcDtNʟgBH,Nu# ]7Dv:~MSYPȚb O"ebj& īn\ IɒY>+JJĖܣQzE? P6F6fK: rplخᄌе} o}/O wBgJ躪"oI=E{w HzoqL{7bw6C! 1ߨ@12فӁl34kagI@~]T0N wӑP0tʜ"h0J:%$>cJ`N0 fh&Dg՝ A{"M6 1],Y{#dM22Oz32%h@^ؽv'>ٞ͹Ғ {D_():Ӹ:c9)S~ӿt)WS]-8I114@*FSF;?k㤟n1l8lғY3/}H-WCzqCBNO%Xs_y{No@5 iS0"s6c>\+P%Z[qc1A?M[bzLxw74f+ Zmc9I N}Xk)^z0G瞮㵝,BȰ)PI}4މDwhAlt>tmZՍNnI! FdM;6ݪ8M4#Xv|fF(±LcܑڎR{Xp|ۄ1Mkv6c;zrŔΜ7D .Oj_|`HEf^_H+=Ր/H׈Ke-}Y%ׅ%pBR oN>nN) H>,X<4#hBI}='D|GNbB:H̽~J]C|\t~߯Mrj椥Q]iс Ac5z<ۃk>Ybm7*VWoU/Y.KTncA /l:)7&S]/i4%iOLO͇*q`-&P0ruݯTG6eq|sLK8"aTN>~sI/fm%߷8ƙَ`Ot{ot#]ω'] iOW%{tSv;=bVv\v3xwAYuǞ{aO4 枻SZubSsMQSZf{gfٶlh!ntznӘ,R=%;IUEc ;AN*3-:0Ӏt6Ze]ͩC}П]\sEgwH0O?\WVh:щt S0DUN110`LS59_SS4B (ubƱ'>7?`ikzۙ&_oW hfS,Ò̽gZIlbBuZ#iU//LV \˪_|H{Xmw]g@OnJ} ă`ے6O@HFil)7iB!p)؞~6WaqpEI~ѰBr2SdYL_u>OSkd"`=9 z6Tv?d4 tjzz{¹%EDK5i[~== !m'lg(HcvR%CeI+SJǶl"зd,OlC4]9a2"7-:z͏!YIH_xO,Qj\k؉F7>2Ƶw2y1u8CfVe>*^]+ c)/&8E9WOд`>N+! hU(pljx @wt@2%:Y$'#'v6}_>{GO{.iϻg]r]BXq=}mwvSp]l)IKh${ySAcj 蔈YПdyn#r ~U63u0O ᔱjoh؁ާG2vK;Pb`,' 13`xn-.ĉ"M1i{cnJ&s'St֩ >g9+WN?uN [!2ؗX JxLN髜! 9#lE(0G7*Y -9֖ޣ{}Z O_'GuҞ2!,x2`@/%D)6q$[xN*o?@i1ERĤ ː _"ǵaAK =YrJm33Sxy.SKRdOߧtͼþy >!P y^ .$ dJ<N>KB~ ^GeNJOA1䠚[RB Re]iFcZe@L%~f|S] DNӓزcYsZrA#AJh)C.F_~ @)WT,)uʞ%Ĥ[jޞk؝*E &M"DxM柖u҈?NIJ9]P@~VKޯr'rkI{i!!m-IWaQu 'Dl %M'+8!e,%/ ~-pRu|&!)hol5=} vϥU}Vm݇m]thTņ<9=c^ ^=uMFOsTbdO7׶P5+xO/ӗ4yn̴`5u}ĸHUKH;ZHޭ6%֑GV5u"g [`nHO׾Yc{u.Ꝺ1={;|;ک-2]#bZX36dC&rs N*϶9lvbf6vfT4a3ZCރ=}"sAbЁ ?O׻4u+ mi 1-󡀕kvl?%#w$)"_&CbPlE^9UF ?8LLPR`5t7<1N =6 k=cKu+uᾔ@${ivt)f7=@H }i>NXumgMtGRzk ƊO);4!']Vp?蚒FB$|xRAz X Fk)1L Աt;}u[8{-1$w@~;KlQ 7yp;HOCh$ߑC$Xlg.1TL !"*ۦ7!Mx$"l n:C g,h'ݶ&c8$ݱhc'@i N|՝R2:|d ȉ(|ʑ;͗EJ'@~roZNJU8SY^113,HS'brߕPP62dA3R2@u;Ʊ{5W5-$ٟ1Eb|HfL+%%sSB`!&'|^^F H, @1:m A]ǩ[y> wnH֟^B("ѶضSRZ [p՝ċ d8iY_]|N]Ѭ0:e3*Xk%}go]h=LySG&N ˸[`޽h lGDM[Nݕv% c ͺí6KW1*+J 1܆;.nHly֔dX5=&MgB~y7Ӣ5%.I+f=Rjb}CN4%A G;f?iwpu_]lc'!y2"iJfNc"@7%NFtyw{-5 :% XOm_J AIՋpܕw/Ss3h|)Zz[2B&Ƶ)7y2kgV3J -3[uV+6i#>RaӼMTk՛mҐJ0F<ǜ֦8!JS`hħ$se$X"7Cr9V€¤{.Hn۽Uf4 ȜOj I'="&^ ut$  )l6eIz]gѱ%YS w0gv#7w@i37ŭLؒ_9zt:n~WƋ$XNtn'{^7ݮ lɦ"b(>8_H!!'ߐ{$Y5ƻ8خM(t2]W8_^4ED#}j @%k&uYjl|v]`Ӯ6ݸ~I-vz^Ôw7wzMk5xN.;"oyl(-Z74.H' NA>OZXDgv$f>W9tyVi#O#{RL77>{ާ>-C"W3isLfUrOH"ߙIXze̳{$_g'ϧIׯKccfJ> !s΄v*'|79TN5c!&%i(:wZeKr%=]aiiYUg2H&SAwcs=&~od۱cIִϒݛ=YOݯ-uKHT+oS2D]=ɔr[r4-2{)qEO;uN;@w? ?Xwjjbv@}U\;!'4x#9,͐ExےF1! )qIO[Ѧ4K]|$ޔQ$og;@OϷ"^+< kkJĘ^CI!{ĕwҶ:qY Ltn4"[bHE@&u;)JJUou7 6Ôi!)'#ė>)I:± ȄϟmST4dŖJud?QSÖNSQtф RiIt]>w%j.M7s_"'{CbRN$IƬ#ј.29 }LRwz)0&ؼ[#؂[꼞pC<:GU/?v'v5]ℼsDC̿ws׉3q6ّFp%D%g& ɘVxd M~vҢ!֍?>5+Z0J >QZkSR@OxTkJ-ѡ2iSl5qZOJ7)ݚ$Ɩ2ac twLDIUSߍa3:C Gq1%e=9Sn%:gJfLѭ ƊtƅjN Hu!/)y~$krf O3-"JFKY~*)Kf},0-)_ꖸ$N\{DtCGB [&ݽ]#El@-|[;u!}SɉܑؤY2whB8SȔX@Or:J|n~Cfn8%{8rOd/ rt*pqJ9uOXw u?~4 Y0~DaAmY3KR_`ZnJ ͒,CBoj@>m?'_?_ [b)) ƅқ-yA \ OIBwOq??$ւTpNmZF]n,5`g٤7Y*?I߇JH[ҵ#J,NRb}~<7SB ߯h_>,jXs~rNHB&'w%'S“v󢝯H.2Hu3[=i"x7eNO& )h{[a)Dr4)m3/d=Nz= 9?"O=oFmIu6f㴄m~wUF<1RDŽ0Rf8옎+ͱ$ftn,ҍlFU&iLqz c"Y-rBA?4!8iK߄,صp OUib؂gJr7y3zˀݏ]ӌ1Bٲ4[`ihsK%6j[4fE dlF]/>tObsUʐf*QuYOK(٠n5iބsh)؉ؖǩٖ@Ud%=v09%)\[u*%^2D$Z:!0H˩>7ĜpK'ku=ndɾZ'DvI;g38JkywqA|"~5%ADq"n?9H rн.ѩ}Hjx:avĂ1HK:=%[iI!iT%O$[drrzCtZ$s.fN-v"Wr"eѺt{ۻ!$9 yK@FߏrݎN`aZE_9#mk$UZ9,% pk;cBD`H+Ilع{ 7H qu  n, `ޒ@'mww/yLA[b2TO$%ﯙf̆v1Y[GȐPne87O'D˂eC(3>]cK3) %f n*ֶ]z.Tm;R%݁ծil]FNNOӺL 7 fqS`mNWRb &cDƦ쌚h=vN;qO@M( 7x7'5+"`BTe+I6NڊuO ?AJNր$B4 ?/[ā)CDAI;u4\ْz~;Jvn6Cҽ.F5!7.z=5LbC-=/h|#O]x^rrN?͢l?˺țקK~T͛p"RoD<1&I==Ts KHl;)Wݛ`_ⵏx_/d=@N.WuXn] {.|98&_%I]HFtVEN]3 λ6 Ɔf)(I Ӂ즾qR[ IRHiJ;ѽN=Yz(e5Ĩ#kִ ˈڷ ͝w WSr3!?O%L<;(ɴ ͸ u$ P6Etn{""privKD'x; w$?![`8k3NoĤkL& 9Iiq }9d> 1&jYzJ$ef MKঢ়b_k:Nw~UY>onjTu6ۍ1i(ѵ,Lc1dr>%ӌᖰ;tFȖt:ƛXrPx0<ߝU!3zͪƴ"pn:>{!OUTʙM (&w> dA6S1!xӖ̤$mA⎞BNvL <:Lz>u*OwscgJniɎ'IRZv7]WlB:s}IK 1eD)c>hE AZwD(MK(5N줌t{+ʬ6G(`-,>Rt:[:WuS K$h81x/B@5f iG(R5-: J(pݑnwZ2-%7)uJI"u^c2o&BԽ"{ݒ&YT0l}J쳌S;vqqVRw0S>7Q!$(%ss,I e?!"s$̑@3V[1rB0N<dݔV([" , oBD&yO/]hێ7%Xs^1 ;iqrԔ3n4p" oFs w?;Qj-Z,[Mynv/"rÍ<-J-BAXBҮSxHi%8fd5}!#XbJD\M}< NA}:kNİ#j]vOUl%=u\M+G;no7\؉c|7׶y/B~UYTqǍ{tLGJ0LmU]s'Se vOL)ОI' H:N=.6t#otF$`S/tQDcnȔWJ>Li>r ҞEU2em8Znܶ!2$sfnt}FϑVR ) Vr\d-) -᧲6ŔLӻ5M)ᤇ|CXߧ˳,Y'BEL R{d꾾w{c5XrN8 Y{<E `O"!gR]#V*@cF[7:ۿOЭ_0t7BQ >''Z)֕ICji%uCNЕڝP'ly ⺚}4l 4Ss"75)VnٝvdDQا$W!{7?*§~![瘒27[Ogە$3G{*y'M fmBy3_okm ;:{AA>+ӤiD"NlH !u&hKϦq%\pXM;`ݺQ2tY)#눍4LHj2)JA}ۮP]0])=*'iNJbw#Sv:i_kMR3*ԁ2eM-ѦLQrГ݉A-o:i)DtNbM#nZv؎RbDAj R{H$bp Noy{{`{Y~f)45#4%MGtט é.v@mRf;-JPTj{֤]n]2،+ ;t>[KPoSIWC,|A~ƴzS"D8.bAI`{l$lbh✴dj eKǺ1BebJqcua>7ĂVg$L-Q[O wBIhQ9$HqgE;&:"*uʾOr1yYkc <-xxQ]j=zqtZ7وv(Jj05K!2;@=)z9ر+9:텄 $?NOTcB}5zAlTgn#Xv|浴*uxSyܒ u 'pN͟TY%\qUL>(N:pF cʒI Oygh %PNJk$ڴНd&A6Xb= B ;xAY_Gekyzx7gZK6,1&zT}Kx~zM}D t`IFt ?ᥑxXRE~W+#o _)iH0\I9)[ʧl#2&Xr m0\ bӚYzղcK'%7oDAMK`lF9a &YDs"sZ6=Ğ}5{Sc>*h/x4A2lH WVx-!L%-4aSTq"VMcvĊt¢*O0'ǯ[u)O(7<{uݿLt)6o~*#u8" Oo M jsGH[XEKu1=ݦhr}JHyVhkbHIyB;b?ႯeVKxZcy3MQ=iWKJk,H8/9sԩVjhe$N^eP64Ѹ:7mKOK=N>: Rm@ik NKN=kkD$#Ց%;Z"{DsBl|v -z'ojXQ+b (߁\B2S5k{\!74L$6t7ɘ)ZF|&@*j!4sWBZ4Kd v]-fqV_ P)n3^_/Yy֍Y`4/~S'@WNz֤0͒I٤-dV 1:Lk:)NIym`ld RJn#J$22JIkZc4؍tԚOBxQӾ\<1:~]IXf`]&%Iޔ$'Z Xs )!N19Ci[ )1N@:O{Bnk}O;Cn^:8!XCAADʖ;iL"iiKKʌNi'ʶN'npĸmM,,_`ɳY 9JH(~w5M5xPc\t[Ӗr- %;!y82{KAҭwdT~zOʖH(B(M5+r*;I'%jkOX'ƅ)[%QNƶ>Y5mRG<. q"7u] f$Y?|Ou])Q+eHcڱ*ڧ1qOhO K{ Qn{>C< @Ndvh!5u/ʮߟ5os[{;L!7U-hm$s"`ݼ:?H 4I4c<OOeUn @g@V^OHKgGfH)AJ ՔֶVKpR3FSzq%TݵIwħĐĿ[!t((7ے_)aHdZDYR BQrR< !ٯ{Re!d}qQ1}ɤ$))TV570Dwr ߽Hh Vnh:zrD߁܄HYB`剀D<b0H} SrG42E(~Ht<1t8н7№ y(A ni&nU@u_@I{[6ԆXHz$ffcA9IYOWHn,J(4.p/JvNO!dV{xg:$SfVUޢ737g Ĥv') ÓR4enEhcST@BVWn>߼?_(MJ"47b+qKt8T!!qSruEHl@<bk%?-d N,pƽ SKiw#L%$iYbUdR, v5`J:i/^QDtYeU\Pk_ڌ 6q|RVVzL:7ѵyo9g\/k"O,xrҫ.^<;x͉5%Stˈ LW(؈i?i,pL[N $9 lɧƁofH%\7 rCPKI -gDƘBxNCC--h'^)P܁Gsٝ\O:hKqOƔ@:u1>(&o*׀t ̻E{mՏ 4bMoյ$W0$J`sO@͔`ey`c;8r:wZ>v*I~N@j?\ HI~GĶɥ놗UhTC6#c"luIO&-W8LEBQ] 1.wϞ& ΟK1J0iӶiHa* Z JM-dJn5E*LFI̤ۯ7LmiSWjvOzMJunI^eK+ 3u 0l~o(?͟(NAͮwݷn:=߽R,֥A >I9THDѬ­vUY9Qp?I)ڭyLYUyq{Uz>)JHZubq:ڍ+礋roVBN] !1#kKp(h`Οrߝwz kBƺ=6*'m~oX;fM"e9=i#fAd撼~=2!#5Wz-˓ y~J^obG!U'-XC@eI7;jU2c#t{Hc}ɀ !٠5;:SBf= 19zc?LݭR)BuuSfgI괤)m}l55jIkx|tN&fTePxչTC;HLHfpѐv}o0Zр$-0݉S':q]Y@j_O'4Ixyؽ0zq$jK^ ]O`ShN:/ Bx΂P+Z'Y =F}iQu1\7JN{vi 8F1鮵YB{RKҬ 7qLEJП qynr-%PV}RAi[8)^!Ub"H7)){}YhGkBMIyˀPf;!6!74 d˘$&3Gk7 ? z'䪊X 'bn?{sy}bG.]xnݯ&'@L:3%Ҹ,ABp@`wf-#?SځTewK dT'էQsKZ `=,!CZ_$)2xiPCaSU^ MRl+ IT]6¤*Uvo񙐡:GKP\O\J0NVY HHW>U/!X)Tu;2naiB8!mQz3+`^nĺ A5u7 bu OF#yj'l5j8%sUq6.SgtĦ+SeVu"7N `7:Ih]ijHO }cLF@;%C”nڪk/l}oh?XrO?)OqwCVd'X**?fB4_v9:D4](XLooOB6Ivcή Hjd?23qF<u6eK~\dַ{1\tZ I_CNށjG5 7V|Cnuc6ژvʠso%|>12GS6q쉉? }dO^Xzj̓'__ѐC^;U|1$s"NVb&2NHPS'7` +#ētt13Ꝑgৄ>㩬-K<+`Yp;Vu81$fSS7PD3mLt:*j%w;2Fp]Ƃ靖Qu c'7dJx 9͘qb@[LS De &17짮줛)dd(VɓWU>NJ-p$ Op☾E7=Dr"nVǒUN`^(UeRt YԺqNBψ)续J xr:O@lLnUڔpL4 !~Jتݬh+X҂}M$țkr~0ÄИT2%"q L,' 8Ôv?ut "ou2jmB)Hv'ݴ g}!qQ]/6:gzB(&1YɿɵF^" >%OՉgvI<9(KKҒr TOb9)J:|%- yH;mʢu=/-ZNZR, '*?ՐYn"1&A -2FQq<N/.ncM\\0n D S\f3Nfx(ѹ?W~*c I*bNIO9[U5tE[wd i/I"w0:P$妖J~ҟb޵̻D/8UNN:~;VjGKJ iE2-547}nBN ϶$yq>1=_gREz#t'B20=Tr,xu ς?II0MzL ny=d0ы'zm^9!*ٷL q(H\Ⱦ4eXP> LU%Q4 c@6I[*/H[G i\'gR5u(qP[tɮo0vڍ۔Sn\΁~f'i{ y# 6@|A(-P'GĽSsg[d il{QrlvZBgKpMK'4[e+i[c6of.wlJ2aZKxں&=25ے >'푓uZqKј%Y8t-+x" =7ʐ r79PL[ⵉ=OvТ'Ho'4z"6'tid,tiSARrV:iY=E?".dL)t4v.]];ݽpHu"y. W/}dVw`-&3mk vLEI$[r sҖ-aQc NGL>!NE1<%? w+kJ hޗWwjìFv~"bj+N`[ }ИgMGɌ86 W1 4މS{Gh:"KՒ ]:$cDjE['9tK쿩{zUnڑ9ppU|/C) HUV*o'L(Lӱ}q~+?ӉZ"*%@-1Cw1hڭ!ƻ&?+11AJ=OHהNa΍a!A R2NyL{w${Mtk%*;? r#*"BLڴCӓ'i@Upt!yD!ѳod]seHh*6kU)ݢ7ݵL(h_KkbǔT@5&A$i|;MLZd$5FT؁s"6ƁmBth'u)*1)@[w$oz~8[@ޒ΅u+4#c7"U33!72 F$o v2%4B ֤֟iȥ鞵{?Lʦ,AYb`L%R Nd,QxرW\Ez!δ"ݺ?~"E|B6Kk:b-}ݺI.<3%f5ނv*;(]= '5#H<:PGֺd'BnhVL]"e7$E?d,Y2F [zBa)pz\>'dNwrqJ$.aH 'NCj a,o:SE}ڞwB&NVmɁ!)<WfqNsY$Dżf+ ͌8y>,^o%D)-1JL&,EN6t-uv0൤HL`41,?^ )_םڒ3grOۖ8ŒDqn+Jȭ%d̀Ob>hj^YpM?F;uQKID@g'^M[VcAck{r"ߑ!I,Jڗ$@yqN'fݾ;&iǪ~4S^} o t>0$Δ-1 $%d&Nėc릾ڮY!m;<%Y6T:c%@SGg !}YbI-C/)Jdu&Ca̓q7] )IHN"'kps1|g){#KҎ^7E@ ( v%*]Ɏ)zQ7S5kk%dI፮R=3fli>u]:.FPr(pVeAț A {GOo5sHEZ)O !{פTN;?WɔhLʫn9Yv@*N;jUW[ߌ!E}Ii%u.$[kSsQT'!:ΚdlNSSē8!䙷ӓ§R`e[,6c'ӝ6i|Vb'-x Y(q߂IP oeJ3Yj3I\*+leoOJ7H(XL M#J :;epKJ,L'&[CeǒB䈇`tI#ϾM*?M8Zru$; ȼ 'hF(IsI {Χf'~PtcH4!$d?i@7 -&e(y!H2F$ڐqbNO)sI\'IU&d=7a'9L4ɼ;M %4ёDi)cGwJbc+)k8̓y7A h)Ln?Kd[pr[-R@ğYqE@,UrҴbOn€\ 5-OʮGےf`!&7:R%d#IuT_ᚘcfmTn% 6`D憈̰L-Ր9]vʐҫ&nt Y0|04!Ӭ 2'eP &k5eL]o*3 HNT)2:z!Q^tlD,8NUb)H :! )j  !g(U.` .i0M (38`bH]!by5IW* 7`zdԄpEO9illw/ZZEm2rܔhhKm 'WĄT[~jlomho<ŝ?!<_%)y2DB}MM߈̒듔u#1DRwtws<<(x%"]a' ץX7-TMt/PBN75NL:*&ʗDn# i6CHne9nyY VYfcxƺ=lKVD ҋL3TRU%)^@!mFzD*~gV17tꀮ! 2UbK >b8YIM_C \v 5'4iN$K)7d=cS2Vx-9*> ~ƒfK}">&%8 0zi7.;NB }ޤ+f$+evx:_ׅ[ɄT x8l(Bf $kxj2Y[ixQڑr a{{`0uXB>$'|(|~#@SVSB>|Yn؛I) 9ɯkqi WNmQjZ۔i[ͺ޼ $sRvg[wqJLքI*ש{~}TN3OuKhW ִ vq%hWxVZZbuN#bN- tJu&)жЈ ж'DʷeJ&DӮNi )D3ӗ<)d[?ƝRYac GE^O: 8moki|'I~B\!Xt,ۚAks7hqځ4[`(LvK-vT`O>e1;͟96WkKTXf~iettkKyt)!% Kܯ#djO>AH)YD?쀠myl;!E]I%oȚT0\cqb:nrz]paKje@&e=GvO@{M75+xH!3n~`c1$Ȥ vJZveIޖv{c9'Y1M\껲$& X /SL׌ތ;)A`; i3tY22>TU »LbvPvr{ w>˓ZuP2䮂5D1M^.Ű1q DKI;'. ƹ>&'۔$Uԩ;!t~ϚBgBVdqZ m>NbF%`| mLo7ER9\"tRT$^T^p-;kjLXż3T}%%T&3=R SLz[&d[DlH0d֛h&+k2j9w>7䥂9.\&pdאIw/ ^0.72͍1RLr2d-{@,M|6BnZv#˖M );)Jk əO_(iJLIIcTr1NM̄Tn,``=!1t]VhDL(-*p۞tt>/6!ɐ (H LMyh-pLNuYi^ikbB>{&>4v)A9Մ/5od5)@-c;Lt'u"ڔI84m}-8-kiVmJ&DŌ-nUݗlfOv#h$ y}ˈ}5@XB؁jm2H֖?nZ,17HPIIŤ\Z2tΝh5o^Xm#"Etϝj/ۄ0ڗl%\햏G+c#]NIc881DKbUa|'&VUd:NmG^&:H~T$!8{i7n?.1nrIIir[o 9~-MB;DxMA|YH sm$%* xXx_:imw7=3օ5G-w6;mDdN@m uHSsE l %6})QJx:ai[ŻwQՁ$>iɴPc*FA!E7i:m|GH|iԔ/-[bt󷚛d^[Zg&푟$smBL(xӮ%S7t<\efܛ5R)@qHތ՜]7*ힽ::uċYKXN1:ixW/JND̀Ƨy&5"\2-DjIYru1~ɾ|ҬdVSMz{Iy)#FCwmB:@@dlخS&^I"qM7ɠ53 ~E6H(^|L$.= = /h{|Ҳ5ojw*:i[ [iJ, :53%gF{CT>Zs[#Ӫ6%Y]|~FJb笆$v-0f[$.k<6i%-tFM@xWqϔX$O4Ou!Snn] 7kO]P_ߕюVtm[iݪ^l蚎)4c:5V^KCt~FbHeJ>f-H(-kMn -$x 0Hw,91%X<06Nhbgmx>К2$3)n,p/UpϔMD78$GO @k@("SZbhfw6B k2%STJȬP;%fʐ TGHW*mfĖ)\O>'diDeB,ֿ;Nf ٚ%מٔĥ& ~~|πH0wLS@n;LK}$FEs0~/ϱݚ Zb 'ϾY┒; K+m"[?)'uD4KnyA*WG'l&8&m}'wn ;BQ5S#ք.t)!}?enI[>uUP N$kf{J>w5]޾)ٜ 2%z<&D.nxQo bL\ uiD+t>=szJÍV/D+Ze M;=s% 昖GkhR$0ͨ|)#`QD(%2u??uҮ/%#}"`2$"N]鼦]N"!Kgi`TW{йR"VL/~q+ծ$:%P+%19Z ^OAwG'mrRfU)%rv9( |UI< 9_n/z2:*E@4 }k n*qҪ8e1%gt3[-i'1ۙJ(t=!zs>L"֡|JR"G>ն'{wk3ω nL4iy5y6!0AՕX $ #x$)&-kM>`1nFd XS2@ ^"fԬΌ#y{msE|~nIIo*k&7D~Z<^M9)INjP;,"tQxLPbGI^YO:z%8J,ItXeBH&dLI˩Ӟ$$fAf:'}siSO8/2+nn p1m@`vNJ?u[-iuu@Uq@1N2ǨX>gu#Sf6Hg^E??r]l'rя$ #pOea1"f<.bxT9'e2H@5SLȱWBn&`U(dgoldz[PCw6A24f-&a$ D :,6H@gnH Oi045;2lZaprLA!} 9J^ƄD:H߉!k IVJAR'SkR&IO4j[(„4#e*a+!K̴"1u&ќ(<k xM R>EҐlFMJc'oBЌ!mm"2JA%kNԸ0%;)ǭI} Y3򪔔9IRBHI3sKR/DOiǦj`2%u>?SvL[TtQp?QJXJ\&D;9dꁺKj%,dj݊eKuBhqS2֙\$^DDʸWNK&&7Yr)t M௚n٘ѹI" )x_q$`Sߖ͢nrO&j'@ զ{XZ,z@wцTwK*o˂peެo$D;DM&MH6Y i,V暒n3 ޛ7VIrLsnQ1Uc_h?NZ]3M[x&ߖPʣF8M*6_&RǑmdw;%iռj蔕_x?3]R[aMKܔ ČKsWlyIδ&@nIl1lIw$v7hŖgm :05;SYGD(3$(vɶteaÝ:OUJGcp7%#s<cE %$Jtfhi)d6 #UωmGU ZUN-kN< 0u i+߉;&ez-Nm.13,:"rĜY)XZ]r&v) t:QJp;#@+gLMلt#8i)&˥lӳk$DΡm?U/Hoڛ)CtR׭w܀ gs"=aǫko^O5e8vZbS,-%ZXUV\"jM7~/1 .n(;ikO')g*bDo&ڰQdR^>^ޒ-q1k|% &%1KvI1-HTBp2^)'}}J&]?ӨFB#Dc++!4^ch d.KRӔ,\| k5npN D RqVBdo9fkWOI 5 O"r 9o*FӟT9?R[MVÒ%`ݺ˺[BER2r !34 OI$5/1Cj'UD]RG2˝YiC:)u*ny቗GB814*OF:65a$ H7r( ]tS'sv3iUKEw*Û>0[wĎIBoRbD,Q8BO}7O'JSciMmO OIk=p(Uᚐ *<Rc -]BcNL2iRbׯ ] -'(%PF6uvu⨞iBlm9vxL#_$Tw R]/M cJRAMZ^_ 'ZKl sF7"iDg]aǓ>NIŧt̤6Ұ r{'dܦ7ѤW B&q/0Y!پ:iMdߤ:I1iZ-ժqd< p78M# LmNO(IQwL۪8%}Nk%+U\KahRlOD0ϫ%a۟Fn|\IB: RbRb15,j?-NH$۩\؀s9gkg"M$DWѹGF&rNE'J.)وPlΏŐ+RؼE=,:O-@-%w."Av>xJ|ڋͨq?Zh%ui)9ǘ 0E`7wlRT} J-6|+E)%kZ) I^J`͟U:yMRHAۊS u7۪Yntgyֱ~$t)s'|ݴHGN7!=[|F:Y$k[Frw#%D6QJ!iWX#2Ov]pg=AA m:Kg Ҵ?]mӊ<\ xq|б'gt tv#3CԥIRw C)0;7f{NTn]Nt@g>!%W I5K17P*n2N"@]jbڙ \Srнa8x#抬'TXS'#Ѝ-My/_ `n/XbqI/["z5Aww#YӢ,3Ia?]' 6Q5-WVЯ$B(ҶGH\ Ӕ2vwiRiᄜlMo~ĤGr ƓDRnⓙTnevETyCӖkh>!>7 JA*)HC}^ jP x7@c ʟB#ĐKL;)Hj`; kbʷeN_IG i^tG sԟ"!eGܛF->uC%2l@oB&S-"\⻴"U"V}$҃HK$NTY=.IVJq RU87!׹6KZ:O<4e8Գ)׉+m.K?7)j?\R^$ dKiUsڌ4Xۆqfcݺwč;H!LB8!wL7G?# OfS픨v rGlA41ts2OXhCH)9~1[^"5E@'7JӦN8!ٮAIH<% A+دn?+:\p7-NԛقT,i2)&"t瞀:C,$!Tf׀㤭E{Pǂ8t)$4SFS"4$Bw-"Dz yߪ/'v\oDrh1.|Sr[4Ȓf_D@,x3EfwEwkp"!i!&E|? $axvCM $ې%F 7LĮ!@U}Ozt&S2I^x#i-!Ci?RLI1 澘xYw7$Kݺ9>#6xFtȩrF)ǀ!GԖ*YrgOS>nӨMJa97|14@2Kk}wt *}t{z۟D_`uӑ]0Cঞs&v4Ik* oӤj [MwWdN|Y \`:*ucڇ[HFBvG[휒T d'c݁.B^ ђILtW9K}YU_E(&̛-:?# ƈz5|lk3=QJwѓf (ER<t'8(p~w8RSqfƵUaG &dBv}JIzA0z('`hÁչ>o*Gw)"P"E/ήŴ# ;d(A'dܶ1!4V<}q37kZޑz=no}[[A@BAvn9"!l +1 y9ۖ`pk@xRgAu_o6wko/q&NG'"!d>RП B`JjL %;Uز}8bMӶ[W5!k@RdTmԲ;c?aN KkPhٽO'QhWtIGÀQ7 iԹI[xKP"<$[#uQfNw! -؎㺍N혐A )6H"+I*թBpB66} ֫QGhfn㣔Md\)@Lچ"&8CRHlv2ɧ#"%uwwczjN&MTZo7`'dۧ%?7U>$(^_Rh)Bɹ$)Y1/*cn%[BҲY)*u.UwHBhLt |ĚO4s^kI='ըl %9vW|;RBw \0YקJ'fBLCZ_p%bJnGϛP 5*:vt>(!P cJt&9m1d=R8n^2$vZGIZWx^UFֵ%#![!ԐҔ8!dUA`BGIDHnLj\LJ7od=$]:MJxOI7ͮuAO֎]z>Ki)13䦊%kJH䈼7RL'ҦH ķ$=S<%!i*_[ )H 7RiSV|NGBN/$ENzg؂pC MȀN恛ӏ.Ád2IviBZ+.ц4Dw44ֿʻ3|dXB-un=M.9*WaA/I 7S3)OomDo5QObVي;aR?H (!&:خ--6җfq6ul$ hKnmej:$)}GTHLu3薸W(P%$H9-NKט mn|vgRH*)7; !tӑ ]mcb3n>3[`:-QLϗ[?ImF*l ҧ[kd|'y3yփijզI]CmYZ>qNɏ=`Q0o HMGj)eeqb#uLr|;_B-tܒ: *jj_,(O"O5clzްD~Nchɇ#]3=N8)XtF@:`ҡ)#kԯ5hUJԴl4 vcnWy.r)zi$d!!sGzД!37Rݟr^d%)"Kyk gk8,&B3_?0t"ѻ ~I>$D}8똨Uo ,ξG@ߋK5%K/J6ZݶJ<biU)p=eHm'[$>n׸'HA W'8W5C]in-!=[jXi5#Ul7ڐܦ?Y~ģτ%+rO&};PN ؼIH(5yp8Ԧ#53<_vJTR0nAfHP >qJSi1=MI:I@&L]S@ 'ƙUY \=C莩='S(aR:tB3Ū $=n `jc E5b(f=sv-J w"qk8NT:Ct5(90[ma\ݪ;7PЦ,M8gt4fSħ^'Xis# ;4"a i:Uj̗D1kGcZ唓v&ѣ '/~Bތ' UJJSePbAH9G*|9jV^Et$/Sc)&illOQJ »bbNMQ5R+Mȕ%|ޘȘh(-8OI;4g?~u-r i+]?_+o;Qz"1 L4ܬvrA;%|jڸe `oJLuCHGH }c[8JHٻR7bM)%![)k&󌘒VJ;MvaKd? %$@Y-N"4ш!0-5qZe$ Fߍ8a uۙ7i/<@2^R.{_5W)cD:6ʐ~`~o"C<>Psd͌ KÚm S_!TE(r@֡!VO"$?!0(([a8L=t}=KOO1J@:nve|lsZ-SRDi&jPS'Ԓ '֚m%Đy2ۅۯpl]ow۸TO~'Fk@iG<-n/LHfzL'&IY'j'b呻9Xo֬Җɔ$Ѣ?G@QӚ\JbKgt>!낌D{5Z R@ 1"U!0픬?-6DKZa=W:M^'`yzCk\Ϫ0)p+B0U2֔D9$d֯XgDEtRfҤyE ?Գ.!Iu6 PHG'Nv)UVJU:0$X%xn'OF.NW30JDLHT2'k,t7{SrbAFJv(e%8%Hԝ&SAZC#۪aUJ|O2Pu%iQ4DE(`)1EԘu5F^}39&Du#I=@4Đbv  x !;Or2Wφ I 흯 iOW4!movKN"pZ#ȉY(%$.!;}7ST\}M1$i5oԶp*e:=DXrmlZL<3ҭ}Bl*ac-02wrq YYMzE!"c6"0IJ$ ! MML!i$m'.dڠKAvС+,[nbQ*x3Meߎz7 IL LvAH {256@qt$tp4>MJ9ٸ<%ɉ U>ΎAV ߪu ݼ1t`@ h$m8ڞ?j0h+]zP,Si dw[ ?뭝Ѯ7K@nǨFMJwi 楆F$jl)\ [$"LnO#(m/- O *Y#'RnT%I!%3!]\m8ZRdjH4%mSQ2X{6imM%?S-ب?bRY]Z/r|_T_3Qpzr]xstpl4$o Sdy-mu4]-"@Q:^u#CHQ: _M3D|~MӥLm5zA$%'@אG ] FjjW:I4mX*'i$m!׈K+X`;DN^;)@NO/( @Nbd' 3v5g4ML'4 ȤnRBB"//V:vDzĤuT'l`$& 4m#!& ŌQE~`;dktu<,Jl8en`+=H~og˟-u OtT]|IXrL'@`cEJk,rb~#D;@4'HOI-EǂF(ZH࿛$ԁDE*!s IHV6GSi D%np9N@:=J!U3SDyڧIdff .%Ƒ{'%/R*qwWjg:1\Lӻ:eNV/]TĘQ0mt=q'߶ŪEMǗ>%2$M>k 46%KI I z KR7wK|ъ GYIJ@,nIw)@IjDw iZB-U~Gb &f0nDҲV FXN}{w~3-r-KIIi!xw[{')eS—ŧ)PR&nSߐ*>Z)ttg0s;~vUH^yZ4O1=1ICڈFT0GU\rGd4\k ۦ==ݣPֹX/eE@&iݤI#].!# L$>A '6Dh:|cz<2֛7rfk[츓Y!^w X7=wGNh*iH`B6 @yo;%}zÆD-S9}IU 3c+Egtl*+ <t[dt淋v-9'cA*hIِb}1v==wf|5g O"d(S{Ώ!0^7i7Q"vNocI FHzЍӴO7TzH g0G{UVm!iSEJVT$2ci0M172-O${ [{OfU%m1F(JMn"wB,mywu  Z*_BLIxH]zZI;!~B*Yw 6&5)2}`JZ&&;I{PS2Di!I-!N#QoJ"Y{GJ8yާ H#B )8Kia*1L>-͒Cnd+vd$%2S;2O)}P)#{[wSAnKmxk|iY [Nr%zu[}cBjyX ڿ$qA1j[kf&ǛK&FRDI!Ѥnטoal-kxZ-UFoɸ$7+[&$ά)H*\Op@wmNA8H KE!)q C@>V>U%K o/T1lR~[OsAAVRJܻ p66bA!J%!4HUo _֍ -Bq"[Pߌ~zvnM^voU_ ӻgId}II?XaYJd^.N@n`׀iJnl悦O"%'Gڟv>NcSu:RՙhYZ"1J|b0G yR;r'DdhwBZmbZEN1/?S=qS }J~c规λ{͒34zL?O LV۪x%whS]yk.e;snxf~Bj*W[r&-ZmKM$ ̑ԟޜ'l5,:^|^ e%e'qhM i$LKHB, gLɘm)6yUFYUfhm~&$U9sʹ"jt'i/I3JomM%_7ƋaqdäM&9V*535]d")<шm=Z7>:5ڭ6sM\G1 @,NS:!lȥI͒ةȴäMSu5cD}=*<YY'逧SRAĐߔYoR|(QR1ٹE@ nkn|*05!S )M=uܦζ#R͢k 'Lf#sk#Ot&% SE%2t5U^{rlѡ Nntv*S31`}N@M6ƫa l?-|&Ɨ&2B| ӗtoLU(IDm 椻IF-̿IG<ǒTFSK#튖) H.)sv܌-)J%$w#[Z=!5T6٥f֯HN y6dԐԶ7PcAp"K$]Ǧ 9&T=cdRh&[,w<]S·-}%uq1~X nVմ^cRa7%vԿ#=iQkXLItG-씼%iPU1J)!$ש DH !5`$}65/qqI"tӺtz{k;Mʕ* 9d3'rȶf ['0OJ#%D s4*YpQ`CN&2M1}UKs֍tT&twhRD|*LA%I53:RsTx Txڗ5*;rA;=sh6Ju(I '`?yFa%U-U ;!`xڵ9qbwhiHKߦNژ֘.I3$V؇Ii:h&7bBZq ia mvqMl[>))NKjb6Akw x$jOE^[H;!@kR`h]?afw#OQ 'uӴ.uGNn~^9/~{LTl}7հ^0Ϻ9Jkm$G#k^P8zꡒnNuaH?홒Jgi^u &ī-Y-y8lnԒ0B&d$!=(#ěb-[imޞYZ 6EmWjKҺ_7?J rAnQ_eoilIy:^v]ȁ).OD)w)芭.SrDnR#@SRKHTͪS7+8gt%5SEnkhSq*EdXI'/%Dg I`J O2,!HK% ެ !LI >nDu$uېDd)ysF w&D$ah ʧ"9WxT}(!#UTrlD>' _g0FVEo$@T-akpI*k`i_O0IҰzD3⋑HUL1cӌLk@!}eOE""Vq`u$!0(i#OAh ҇ΰS;&d%Xv1=Us_6|*8BpK&Qf Vm\ ;pFLȽ!i !Xb1UzZk6P4a$nA6'`;[ih qI@Bls<|JZ,xzWfS+2N5(*B}^RNsJ`) kvT(^(q` @5YE{ к$EkRCM ukNIm,mdE Xb[B7!yo.rB P%o5*erHTQP`)3 +cJit#kkIvn( #-$BC\:!"&qdoԲX@yjB0Q`ոI"BAptN&` p SL|`](Ej8ՐW ' xnxSo ƞtR^OYcA96=QV ;<mJfW5/<|M"yԏ]F*/|{m{YtcUvk1McI6$r3W|2M WɱE|yA"E[6Oy:'"<1NӋ^m!f h'xubH]C&fPZxT}^>WKlez;buKN8 P00: :?%}Za i9%!9ڍTF5MjTJq+A<0mtBo ,)BYk27cnwo*ڔ!&"LȖ! ri YUXS?!+-d:O%u K)UQif3y>z ١P'mHj Y"JR7[{-QKQWD慶71D]UYDp\@ۧ1,A14][11G|Z25ɶ/u0,udc 1Qt)ׁM )Ȧu6]Z61bһu`a;7Hφէݨ}ںYsheIT6MY Sf, FLlKWGض9"B UZ$%1Oߦ UMt$b˿K#'Dy:rL">ULr,5n݁k>'2ʩ07Q"E΀|HTϪ\ڋ!-Le5;pKj ɝ͐Dj853S_"BXv'id"27WIv⼋t'F{iVVh7 @䖊4%:dGڦQQo'[7RDm'`cj8!+))\3$JSdJ!_k [s ˛VeWTo=!(v~SvߍM?BAweK"=!tcA# d]{@߸WT :UZ17)w*e#9lLM8k Rh}L8;M-5?~&kњ< /4$bZbu$ɶQvީ7IQ^;ދuk>[Iيb|YF(rT "LMZ2uwRԜ4z [ _5 -!Gܫ%]]X n>)D)C_$%P]Ƅ$5Eo͜Фjmd))ҩ:3Y;InhJ77K:$56DFsI:&@=CJ$mk:/N?o 5;VkyJJD\̷"9N%!sT*yQ~7Sg3ɸt$"I"eo`U`z}Z],vD&5h>t5/0nkNq${ӆI ;&~AО 鵌%L$dSLx蚱ئl$3]'OdbB:CWrn =!K: ]t(C?ӐdžĤ JA4JcfbH~\&S3YhɧF5'B51WJ6@xlN[|mԑ-v7j;X÷2i$g/Ѵ71RLRicy>MSN (vUئ bb_YpKi0m PJzӺDDJ:b0UNLBv;T*kQ5܈SH{neTq_''ϤmxjTFz~;)! =K輐]wr^[1TX`8Pm4-t~sA-?8Z,C\z1J\ҫx %{ rѷ&6!2[߻>)f>inR$=_6LyH~P0旧sa0t}K -$vdG dǴϺqO1kN~tEOm=mV 8u/tEBwM>ӽc Hפք(m$Au@V8!y~D2SgBһc6Rs5l_<|N]F/~;ze {J64aSWD] ƜqZ ;/ 2 x3'hԵO)OUqr"u{#/16ͬ 2 ~qR߭yBSARp?1eLՏaw>C$642)x>Yd4%TcS+Ɯv4j;yz`Hw~૓xETFL$( cց.'}\C6>-݋=&_J$M XG?E䧉|jR:0pܿkIZWjHkiƮ<–u6Iy5A/-අ 1=Ƥ*tRp^L?-C߽# xmnۋoR͗mv2WU{ornT9Su69Ot>&D l}6aI9iGBVX}mWazu0 ί-%}#ѕر{YIYCx|ؾ~RFɼoIlGD嵴FeԭP|NHU2jK4MSnil8t#*i|n X/oHv@6Q/I ҝS0m]o4]!/jd? ߓsޔX%DOx}ʠ|K"\I@y*77lQ󙒖SCL?RA@MΛmRWBW9IƈŢD$;9H336I DR`Lwn~E&S@mJV)qV`= ѹt\FtD~צf}¨pR0UzViAQҔT;}tn蘦iESvZ F٪;Wy_A :󀵐T dIC o,r{~J `62Ic2ef{bݭ*Pb>!*+,)Jk 6IJ+W:'iNڒۋ? t=[B<5qNAFqv'sPromJvS߈jKf"1<ٳaA~t8qW l:S]pbiCNy$khL ˒3X[6=lfI,cz]? {5}ðM!a;iKN#E9& [\7IL~U ܆M IM Sxɿʹ)]H{DHӺAhL|_ kz+klLږ>X{05KI!y&|;cv߄MBBw=?>!ҵijN% o4TV@rm6|J YEQ$}|HP:Ǎ<Δ>'/)0N)1`;@҂HէD|Nu`*nuRqT8oԂĎtpYZ`ti_g=i=x6u*%C>#5ˤM-]lzT)p&/~5bwFOr^V(u]$ʷxO@%׀SReYoԱ1OL}G|$evMᯊP$j#'|L{ZQ͆@mJ=K!`G]_ p{ZOJ7Hn2֮SSTv<`QCj9 ܨhMI1D$1]kmӈJi*{<% v,J^m.Q$2 vmH\~FzV7:.]{.K:Hzxv2t'o(mP}\~$]qd ~Wb]M=9H$a%Lj/BSetW3k܀fyQҨsTYP4k6usuQxndx"{Am bd~M;U&cEӯXרUFo(Q"ld&)o<Ϣk&%(I_nQ 2Ek+!ֵ;qaJBX}c+~O$`d.bO  ᫚SBh2csJNw5*2mx<$ f`@' 8xv# t,4[pI+JT}'ЂaC6R %LUY>ٙ'~'# oy"aK6M7]}lI!NJ@:GڇSiش,fCn`vu Mk2赈& ͺO T$=n̼FHG'[S 6 'n Z&J|'ٮ 9U>U ?݉老s1;ñ)diZ}g&%P;1/5l}۬U46Ŵ疿>8m4y!M/z$bL}a%udWY'"1eRssu;TlK 붆H{voIрq$Φfc,PEB K՜խw4֘4NR1=#)7i^pݦnRԉ{Keړ?I@vYe烾h]Gt}Zic2621QQ͉if %I 1eȊ14$J'!q0›&}o9>bMOPO<9 OS'3XkH'LmÀ[Y^[KCOL<&yʊɹ7j8ޝ+I14nI "U" hM=0஛ޫr1)HҶȽs1TΫ2)-0FRҤ* qB&'Q+KATRCsKcds)0 iyGܐtlHE }^ Ⴏ$q3 ))ᰀ߼wqݴc[uTٌL%` &=\Mԯ*zQ5*j|g ӥT)鶾'V%`<%n'S<5'4BDgm3*֎Mw>$@.eAm 6 ySm~OT,9~Ter`b0gܾq%1rTW=Q [ҸDnۯTk_MO4#o 2dg@&5&G1E&&$퉰I14]0OP~Z$$%ܜy4SYާvCSu;tQ Ǹ{L#7O`.&Ƒ )1T@+[2q#$ԧ@; Q]Dm4 N,0 ,-'xzX:D>Z0UsA!")`ű1DaȜTc0Jط:L~+rP QSO&cGOnҮn Pre:7iERHԽ4.)=f)'mMSq&9%76[1'CRz"RAȫXԤxU'"dz{" 5ِ c4!)Ӵ{#Ku͘I]?)ք,U8wcbjb a0]uDk2Ä$t}h״nm"8G*XSi`I&L?~)[cе7a7m9 qY)M㴠.ĉv7 mRD#O99ISNp/oMm|1 ۨYl{nɱ/$9^Ӵ$ld"tnnjGd 0%z4nBjZtM)'p('XO +Qgi;b*yMۖ4Iӄl8w;d)"@$b;)Ļ*7RR({' u`pRfRH17 Fů#e[. 4r#}m ;M9 mތ͆Vӳ3KsH'u?$ϱM~$ רZ%i7(d Tgj@(3@&isOFؒ fLA3A%M"Өńq5o=k=k&?-HNL!Qa9[=)274!p)/wPeHδh_CίǏ_ҚBɮL0?12:a/LRÓsC(1TDXFH޳I:D[p'yQO l '>Rm 9b*h5iVɄt>DRM, f$C8n- $17IZ7Qo2h˷T$%ć^Kpjq>? vibH;55'*mWe4)nyLH@30[ɔPp#lvn҈Ic|_V.ZrU%-J&Q? )I%Pr7iDOD]^ \Q^!NVFҴ$Enr:@52&ݑ7њ- x׵' Hǘ;V1ŝd'91NCνUaEo϶+\gS42~2Z0m M{ѱIw/ۤvez$lR؜;S c.YF}B|cCϩ3|v2M/]wĸdOp@;8!M5I MKH48XKA%Eu5yzo~N{ PI*D J$Z)p&UYj$S5sO s zcH$0Ug3t7<% %myJcb)Jn۸Qʹ7ZllLƒF`_EJ@&gᚩuE! A&K 'dq+uֲLԱfM2[ؒŝ =14V6Ѱ;Tk#C_IsyNҴ6 ?yH!g5+XR|= .Tqli{>Z)N=,:Ybm`ȳI㚴K"LMR:ٔl"n^힀܉ԟ%翊E%l!ݳhZ_C+r$ U Hd{uIZV' Jιu dNe;YQ.ߪk`ԫykDVFLq9b=%<$_'#d )s_b oKn7Ukx5hYX/@v#i-i-ML]MdW8ݵmZU7FU{@MwC)%& BԥC^uOԤt D֦>]$EIX DDo @2 . )V*f V9OaC)aXEB\$"ƑIU*o٩HЍt/b ]p:AӅBQpk7`J>ncmIɄ [ ."J`T0JKڞIMU_P)"Deg?]!kRL6̜hO2'>BqB" &EFe5R4,vk< 8={SŲ)VdlsCyL;51C.o%=mga|% d7&@ ٫fҽ6hb— ݘnq4Ұ#k 㔫=fljS@lԖ̹'iA鴑OD9hD=Pi6Wl|u|laM  'ഋ&zkhm>?v~%w>NF"܏0'/Ħv'#|߉)Q(E(tSGd'В KPz8~Od94wO%iTayT!hJuRǤv0hdN;L%zi[&  lۚkDb i{--{e<Jf5)M#"ԑ|"slƆlD& ;`3)95QKb11I@(@&6? ֠6 Dvڛԧbˢ˫~PL\IkG,AHIE"5m| ́u/ Ȑۼv/drDSyM 9Kĭ9耺%koJ ?oZ3W.jB6ghRA|:׊"]S=!db EWWb^/ڷĐcХ'*c*gIG1#(IS^,_ HS老uO&P4'D8Rrݟ]1C ;0b$UO@w>51 [MCڌj^ &) `H״} <>b0Q }jWWEFL^O<5gW2DAI!Q6͊(p P@>!U;^'|yɸ=hZDъm)^K^&;ԑxWe¦'uFu;сYe4麘gMy1O'1YO\'+%=tM2fS2ڱ6R]ۑ-Yf ayJꔿヿ+WDZ!͈GG%\H^qd')?f" (6+4vn: p|vԈ$CHm7uMy.ݯ#Ov$6i'II>^MWHk@85I9QRޥ=Æ5;FkߕOs5Ȇ*WU_LA+lpLi1ZS3o &lɤDj(^ѹk!;~ q}34Dp ϊWZ)2eltM;@p+ڕxOrwXM҇U4zMc 5%繍7gp_yܯ~96]v4wDT(XNQ*MGlZAS^(ȣ5>YPnH-I{/瓾|_uy 6Rz؁G9*;!:vhIɭEb|&RɆ,F.Sn3-u|P;Njr£ Վ*F$kb"!ᑤv% .!VQjC~7uILQ 2ۑ9oF697{B>/Bݻ*7vꇑp&a (Dryr]hMMEQ]3cf֪8qe>? Hެ[H v~/ OHGL|Dl{ 1 TRgT Yh&DF&5Xf^&|J[wm]ل~& GǏ*3ug~(mߓi -²Eڢ.ӴT7 S"Q )-I剴tő XbHk$zhs 1OѤuiuί`}{Kf6!'I;;NuА:'wB7[Gï"xNMty޵i>XbV9!?ikl1ݬ۪IIID̽5qCH o;f7% ){t6Kw-OERIT귿`[4Y Ox{N9$kuqܦԑT)Nk&OP/NRH[ pM6Nv ##ۚ+;UlnۗF=!?Ďo-2ޅ0*S0aWŜƟwɮ U""Ђ|vrΩaJL!Cid+ԟDЁzLMiF?QYMHՄtud[dӤpxΆJV4oDɇ ց_Ր uqDqN.>vuIIquߐ(DH`#:cMwkg8> $SMXLu+DH Ŗg!Rt}nl)i3[K2u174=(`}͍yޥ2CHy3%0d6 -a36Gh WAU^1ŹLKlmhwV|5rg8rH{')NZ;A{hm4'D0U8o:S<] "qd(*R4O9|"I]%σ7|l&zSx0Fܷ /Sn=j5ԑkws&4FT 7RRԑ C^uVnSI%k J$L9e'v$"#F8h.Mt*VRS6׮/UOL{)țD4lD7'Ids}2̐4XB3O2xpů T:%$HcTPrs%JSCVSmǴj']nJ irLk80mM icPIBW95*|8w=5[܌P> ^bCS: ?A{mau҂6'r&VB*@Lqx&$4m?K@w 3^0؁#Hp(OK|EZzJ@%-kQ'~pI蟉$9|=fȴNl 5=M"pK(2m)dM'ݦ$/iO ^}mq2ǝIǐ< 6_]~"&F MÈDԥ|w>D>(|Z(wR/e&Q* ]rf)gf.- sQ %2kalJ4XCԤe^q~{M6m=cxJ ;LSӶk)anu/U!VZODӉRwE4u`#:k[K=}n쭚Z_US2Q[Ƒ7 %Xb׭ϏEg7w^!Wt[wNm IѪ{Ŝ)OwiB6ہ:BLt !q4Jm#nG6Ŋ-2 o;G&*ǥ-ucvTJ@. :c-D.>-[!s׵r1f 'mk hN"8i['Dj3i# #\v ^$d&w}9gI&)YdM&[u-cJ:HJ tO$ō^3-iXW_uf`%m[:w쥄* I2cSy$%4dyF,]g0: C$ 5)ѣk\cXYT K aLkw`5@ٞ\mW:] Ӽmg_K OߵFkٸN~9qȌ%kX$Ͽ_ TT! 26M6O J0/-DSHIN'H}@6LϱvS wM")O@o&Q}MSxRЗ/K%I _4c x44u8Sswd'"!v1It% (bu W$\$t PH>Vh D&z"60I $jfһs n7Sn#*NWo/I;> >;kw6o7Dwb5I{ZrޜLMk*8u)U]O/Pq[_-ޔ$Qԋ6bbSi@Q'@/RxN& ho^F&XJ'WOO2D'Ժ"cH^DX4m?S!)T[NӜqPs"x?PK搒[O .j2EGoi+}9NADjPT&,KDǓ-'z2~ғ!9KH(0}.q>dh YouwSDs)uN?Q3gk'NIoW13LR&>'cd;d V[]dF6O5)jg$)"OƧ# @wecG};>{L}J,2xC鋴;L9C02~m"9Sˏx<@[L_n/ToI1˪UMiJcB.?AziA!9ɠr0Oޘ.5jrlϓ;B)| `DCj24Kôţ#؁-ewstmKÚdp}ӿOӍD3V +t<ӐM`` ^/4k`#;@JicAoZ'b6Hy ~UN`J5!Odec3G3ǂy2 hP ,QdW cOx═$Mj~KwQ #ΦQ6ENU7Ewk>MHu`ͥiGFR*o[yR/B7 }wbǝ u\v|' zPOj'wڽSA (]"^I٤?XGvOo;Y)3D,oE35|]3>ucbv<)%Jɵ_; iv)'Ma<wS] ;ZcHqI [ κ:t+ȟqF{-8G Rq!f\9_ҭ}&^ HrNAyk{l Dg^I9ۄTص$H6%B{%٭w3*xNTn/YԛS%keRtu`q1!_ p\c CZi E&,2>6[YsIݟ 5'_ N4EzRIi&s2% %mJQm S2#C9|n3$ @2j@|mUb Q0@llzKT^JD' 7U^dI'lv}A\*Y"Fʎ-%uAS` 4lf̚GsJH9])n4S*_Neן+%>oR;%Ue&xR.o# IH!b`}{4Q8PiJ$qy$="ߙ2l!T, oqlIĉ ة mJ8:bc'ûlhN_p^:%t a*8~2ɿ{O?u0"Srm)X Ya+2mJO%) LIYwc95@[F̧g.%NDٔM\Itxϊ ТswOdq("@s"?j=!R3 $ĸW8D*;;I0gT-\!kNrݯ&y]ԺJOu(Nհ:evdxGL&Z땈 $s:Itm7RRb+|fP@{R2=ܤ'cs$$#= PML4 8]Yّw 05s^M{ ,~wn=cO;34bGg|~̀s9zZ7>@iy=cܗ:]dtD4ٻ)MIY IJKH(A|G$u4D(p-pHzCPCI@Bк=J+!jTJٲ14Kt)Ybٖ_?aYczPaz#ҞO$BF;,jH8ժOwS2%R)32ZO'RB`ɉ1$8yR nK8w%[TIG{v^ fWLs*j;|X63U[I!QM<=iN\Ru;JvmY)L42g~r|ք! t-zլBRCA񓸍F뷝ēqBfdĨ{?!Of~ ۙC&L5$u|$pqõ ѩeMu1ߐIM]o3(y|4PMdmimj7Jj乖s:ƨ-AMZ5ԃ!Q\";)"$sܧ]CKbC6 iAZC<7B'ĬWREіHAyK%8I?YKM`9!t 4IS ; D+P6#0@3T lCF-Z>4c` mF(C7dۨilIvM Rp^ lqڛ%Qy Fެ 4D ?= nk:_dn 50ѹ4oi5$ &M)USY:maD$]K^TR6 &Po=l5! >ٛ9iHRwLbS#δOfh9؄CnR=3?UţG>/̽L1/SĩfRzfW}q`FBdlWbA&ۑ_mZ>TQ#D'򰆠]\*MOBBxkJeOTYНDxiC)faq d0qΫvAAfN>֩HJz'~d?m' O# tI3э> *es&Ѐ< ͿF H)8Kf )XRI"erB'}/I_J2;ST+}%]lZy2%wi_ptn@sBh;_L}" 2$,UGԮ$Wu{Zd1%B^tj.<5$~K6 I:>)[g:ܥ݋_Mj6Sdȩ134RtkٮQ43h%qS*_.Ez ?ꉛ=㤯wofX$t&PK(a! Vgüϐ}@JѾ̮_N~ t Jme!D!\ga42˪#m3():᚜/R?Og4:%g6*;~T[IzB NZi &L$(*Yۋ0Y*/܁ByPBM1 =zЄ8I>鑱RۄhJQgyPmL)U$ڈO`'oQ7ŽNY;6 aC͞WR{:vwsg{(Rz<'4I@63[ TJ 7ʠ||7fN$JmzdN0MQ{x>!4M_*cfI[$}i/{!iF&p(XL|1PƨMߪʥ)p{5%tc6L#Iyx䔸ofXj'̀dBc@T*S`oZ˜3;6 E&`ʩmL` ,4{uWL`DѨRnOL%u? ZA#H@{B}kuSQB*1dh}ce5kl% K}SD %jxߕ`mg ڻB2U|;ǴDKlIɾ›UHfvcM~3&A֖s|ew ӆkDX)aJIѬ?QD'#3}H[w[_>~ 7 !J{:& Vþ<1O(@PFH >{uQ%}%XkbZԕUxIʮ[PjhUye86|.,yN BfXW5nW%~+{-G@#JKAfR 8W+Mݞ7 0 ɶZm?s”2|{'X2Ae}F|3 XމM3j\mF'1fz&y]iidsjZf1xO9J%Q$ogRagD5Qnn u7$*|d {G(&br8W%rG#~[\mH C#-ɱ tdB4'}#tloDyCUd[Hi4:ޓgK)LFq*p,{hGm6%!3 q$LLƑ{` yvl~φLY@wRtטK:id;Bo J'C據bv{yj5%2v^ߝbI$ Xd'!fX`LuA&/ޕU $n/&OeF,$is)7 D_3FkiX'wTn ~&L s-=!(<& *&.Ӽ*YHv)G;T*&a9!yk V뤩tAI>C/plHvJ S"iu~CzJdiygMDZ~ӺK.i&6DHA rT'"m@T ,-K#zLu4.)dS 4{g#ED-:u~j x~?g1L zBJK6.PKHnMߊ}?NQb5f &dҽ{׈6HHl5QKM`^"Oo/A! sb 9OK/Y,D&Tō=Q^cDI%gxh$E+؃PB7GYc(A:bT(Y ȣIFdLH)4Wex]s)z#@{ldƺj9C(N0%ǽRˊ'є$ )aITzO:`k<3mveS%`@; M9dKJ~XM7 ?g^\>wiO!5RiKo3܏4e3(+F=F\t{1vʨ9GeP$cZj4mإ j?Xkv{9դȮ9cd?L`BXRnHgI B2obvy@d/RB?)囀h o[04mXm)Q\;`OmDݾT,< v(5KHO,d)@ %Rύ xL5 LFSk{ʃy}=aU8%]e&qe@lqO"/0TYֆL3 q.5 }%'9 Ox"[Lg =TZvø>׺7i$Kiԛ/#&{55\n&:&r04>PmkZv.YZlg¶ަ? i5;![؆!ZG~r+2Ʒb#ÒߤM7U{~h 'H .%++oj* jMɞag8 E݆2DOJ/s;vD"U^ cjÐ#=|ޖIA t Y8# RUK=IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/play.png0000644000175000017500000000341112220076757021664 0ustar thpthp00000000000000PNG  IHDRHHUGtEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp ,Bi;IDATxkA'D<P$XRJғŲ'A(Ox`($AQAbAB'1 Y؄ݝfw ߾7L#IU .B7U t :d CO϶Ȕg|@4mAK*@"EtVChzk2A-fkY>@*8.C?C3ڜ^A1-4DއPcW{bߡHHQ{h]gzFgޚ+YyfN:뾙bY`29Y6-mi^CW=^A+yC>6<nci50br~oS5o29׃f]Y*yUt W(k U4\ Q4Jbhr=0#MA1GMu&͆&Υ $bNiR:IZ5_9M;*IzP%4I_0+&_VKɷ%ichC&8 2natJF:AS#JHPH#rj 93A,JjĎNAqM{j\$&.wx`М Q(V ߍȠCC8L}<$v V<(Rg(vɠGyۺoA/-ʯ*Cviw=8ޝXxPt2so~w ɉ]dIwNI!3iJ 7hPMWQ#r¤9bu_'1<4,/K̊PƯ kCm`y+sIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/playback_controls.svg0000644000175000017500000002537712220076757024462 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/share/gpodder/ui/qml/artwork/progressbar_bg.png0000644000175000017500000000103512220076757023720 0ustar thpthp00000000000000PNG  IHDR.@ɚsRGBbKGD pHYs B(xtIME ;.^"tEXtCommentCreated with GIMP on a MacwCoIDATx1JQHgMr ظ Wعm]VV@-|.!d3܁y @wV$IFe#8S몚4\$I| $GUupv<$XgzР.D zyu מ/Z&5u653Уp \p \ \p \ \pp \~|UUIm qUW[[=YUXUUݒN᪪ y7szIrRU6| `Z.jb Y.e$IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/progressbar_fg.png0000644000175000017500000000676412220076757023742 0ustar thpthp00000000000000PNG  IHDR.@ɚ CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYs B(xtIME -V"tEXtCommentCreated with GIMP on a MacwCIDATxMv6'G6ЭdqإudO|T5=mH{'IסŇ۟_Rʪj_[~14eRjg1z(Ci ̝IDATx\Mh1N O XEiYQ`ZBQT{KA EtXZvPYU(xQ( {-%I2Y?ɼ|M^^^ijL{#-^` o%#[C- P],x|Un}`?kT:N\X32P)`kNE 8Κ_ TylVf҄1bjM<3TPuB9y4G vAM)>QdlGS&NXQ=žHF)DC>M0mWD%tˇۛld q*jmJK6Ul^&PKL*EZxY 3o(]Oet[PHEtU 2)S1MQ Lu{9nK8B oڀr +3"L;MϤh\p لzvIP/g_/RY<>4+h9Eᢠ%6@Â,qnd PF6(vsA.BXk@VGvޡcKԬmiڒ@y@ $.WTմ%*'ٶ^bkk"ݑ*rr`s- ̹@M[=Z΁@9Aq$f )0BFANX0s< =*78N/Y,j`0[O죥TGS|IL in(/m] \rcZ$!L/. iϱ񐓕Unq#=l6BFJ@mIѼtnəv"*:Gv|I;礽|_Ո*H7ϙvٔ$8qXW Lz|&Hv OR5H߸㾥!IT` ( 㑳,M \qNSOUTWz,<,J EerR4V`+xu g}D3r<G:a >˘IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/slider-bg.png0000644000175000017500000000040412220076757022566 0ustar thpthp00000000000000PNG  IHDR sRGBbKGD pHYs  tIME/!+8tEXtCommentCreated with GIMPW_IDATӽʱ EB2cP3tلeBe#z}PJA=pKDsqΝ$>7Y*FIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/subscriptions.png0000644000175000017500000000651212220076757023633 0ustar thpthp00000000000000PNG  IHDRHHUG CiCCPICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/9%bKGD pHYs  tIME'_IDATx휿kA?oAJiTX 6RH$a!6 k6%38nQA[pxܡ^ |~fJ;JڒtPR7YC൙%IExef_ pX/CGWyxff҃]d$mKz*>|v7UkI[%@yAJ$-RFb!if lb@R?EѸ#8~SЊAZ"bxr IRd=37gj@23ˡt1(9m=%9 r@C/V=wsr@9 פY4ޏr@9 W7]u9 Є$ |nz,Ůt2y6. l< u ugcbib6$^|_TnLâ ܃ʳ;6.No9쑻N7*i3Dt^`qss96FL /TsI8SU3; AGzE5 GjeX*M/9?&* dfR Nϡ4IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/video-downloading.png0000644000175000017500000000105612220076757024333 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME $0>IDATXAN@? 1aƄA3 pnFtfXn\x+r !fD 7ICltZ %Mڗt뼁Ggt`/b̫d ZD>`GvK7}Z/EhhĖETZԀ!p[x"M IѪmpYcd4;YS (-ށrV)~K9pU]x`[EG1 ;JsaJ)-n7?}Sbwa=t{AqVPG횒|%oSF3f@;V?ͲoEaZCEZj(N~(NWe\|x+c Z]x`C:D:^?VgX{ H.͹ʗ{VZNZ *-QZ9gm/r̉$UsIENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/video-playing.png0000644000175000017500000000107112220076757023466 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME %\v(IDATX혿N@?5ap1a*I#: v0;1aq$ ?~IݧG Zc[+_yA?5uO PJ1+HkE!۩ևARfSl\A!UWIϱMZE)r08hhjh29gN1p-z*y/)ng]^)vۚ#ϼ,\=JIPR0w t5Ƕ&BM8P]/X( Ҥ8AZ~ ZĄHCU;qiC +Bߟf`? Iq֞4)NI& gB-p<ࡩ)G1wl`ͱc[X)R#t_~\}IHb;Y++D)7paΨ Y۹hs'=IENDB`gpodder-3.5.2/share/gpodder/ui/qml/artwork/video.png0000644000175000017500000000073512220076757022033 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME/!x]IDATX=N@?#$"+BJR`In@C-(R"qN[py4XEOcgn<;!H$E!*I~t^]lY XJڋb_١u?!-hvIENDB`gpodder-3.5.2/share/gpodder/ui/qml/harmattan/0000755000175000017500000000000012220346122020462 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/0000755000175000017500000000000012220346122021251 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/0000755000175000017500000000000012220346122022675 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/0000755000175000017500000000000012220346122024024 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ActionMenu.qml0000644000175000017500000000134712220076757026624 0ustar thpthp00000000000000 import QtQuick 1.1 import com.nokia.meego 1.0 Item { id: actionmenu /* ListView for which this menu is valid */ property variant listview /* Collect actions from the menu here */ default property alias content: actions.children Item { id: actions } /* Show action menu when this function is called */ function open() { contextMenu.open(); } anchors.fill: parent ContextMenu { id: contextMenu MenuLayout { id: menuLayout Repeater { model: actions.children MenuItem { text: modelData.text onClicked: modelData.clicked() } } } } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/BusyIndicator.qml0000644000175000017500000000006012220076757027330 0ustar thpthp00000000000000 import com.nokia.meego 1.0 BusyIndicator { } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/Button.qml0000644000175000017500000000005112220076757026024 0ustar thpthp00000000000000 import com.nokia.meego 1.0 Button { } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/InfoBanner.qml0000644000175000017500000000013612220076757026576 0ustar thpthp00000000000000 import com.nokia.extras 1.1 InfoBanner { topMargin: 8 + rootWindow.__statusBarHeight } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/InputField.qml0000644000175000017500000000100312220076757026612 0ustar thpthp00000000000000 import QtQuick 1.1 import com.nokia.meego 1.0 TextField { id: textField property string actionName: '' inputMethodHints: Qt.ImhNoAutoUppercase signal accepted() Keys.onReturnPressed: accepted() Keys.onEnterPressed: accepted() function closeVirtualKeyboard() { textField.platformCloseSoftwareInputPanel() } platformSipAttributes: SipAttributes { actionKeyLabel: textField.actionName actionKeyHighlighted: true actionKeyEnabled: true } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/Label.qml0000644000175000017500000000005012220076757025567 0ustar thpthp00000000000000 import com.nokia.meego 1.0 Label { } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ListList.qml0000644000175000017500000000056512220076757026332 0ustar thpthp00000000000000 import QtQuick 1.1 ListView { property string headerText: '' property int headerHeight: 0 property bool hasRefresh: false signal refresh PullDownHandle { enabled: parent.hasRefresh target: parent pullDownText: _('Pull down to refresh') releaseText: _('Release to refresh') onRefresh: parent.refresh() } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/PagePage.qml0000644000175000017500000000173712220076757026236 0ustar thpthp00000000000000 import QtQuick 1.1 import com.nokia.meego 1.0 Page { id: pagePage signal closed property bool hasMenu: actions.length > 0 property bool lockToPortrait: false property alias actions: actionMenu.content property variant listview // Unused here, see Sailfish UI orientationLock: lockToPortrait?PageOrientation.LockPortrait:PageOrientation.Automatic function close() { if (pageStack !== null) { pageStack.pop(); } closed(); } tools: ToolBarLayout { ToolIcon { visible: pageStack !== null && pageStack.depth > 1 anchors.left: parent.left iconId: "icon-m-toolbar-back-white" onClicked: pagePage.close(); } ToolIcon { visible: pagePage.hasMenu onClicked: actionMenu.open(); anchors.right: parent.right iconId: "toolbar-view-menu" } } ActionMenu { id: actionMenu } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/PullDownHandle.qml0000644000175000017500000000346012220076757027440 0ustar thpthp00000000000000 import QtQuick 1.1 import com.nokia.meego 1.0 import '../../../../config.js' as Config Item { id: pullDown clip: true signal refresh property string pullDownText: '' property string releaseText: '' property variant target property int threshold: 100 property int lastMinY: 0 property bool startedAtZero: false property bool wouldRefresh: (lastMinY < -threshold) property bool enabled: false Connections { target: pullDown.target onMovementStarted: { pullDown.lastMinY = 0; pullDown.startedAtZero = (pullDown.target.contentY === 0); } onContentYChanged: { if (pullDown.startedAtZero && pullDown.target.moving && !pullDown.target.flicking) { if (pullDown.target.contentY > 0) { pullDown.startedAtZero = false; } else if (pullDown.target.contentY < pullDown.lastMinY) { pullDown.lastMinY = pullDown.target.contentY; } } } onFlickStarted: { pullDown.startedAtZero = false; } onMovementEnded: { if (enabled && pullDown.startedAtZero && pullDown.target.contentY == 0 && pullDown.wouldRefresh) { pullDown.refresh(); } pullDown.startedAtZero = false; pullDown.lastMinY = 0; } } visible: enabled && startedAtZero && pullDown.target.contentY < 0 && !pullDown.target.flicking height: -pullDown.target.contentY anchors { left: parent.left right: parent.right } Label { color: 'white' anchors.centerIn: parent text: pullDown.wouldRefresh?pullDown.releaseText:pullDown.pullDownText anchors.verticalCenter: parent.verticalCenter } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/ScrollScroll.qml0000644000175000017500000000015612220076757027174 0ustar thpthp00000000000000 import com.nokia.meego 1.0 ScrollDecorator { property variant flickable flickableItem: flickable } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/SettingsSwitch.qml0000644000175000017500000000075712220076757027550 0ustar thpthp00000000000000 import QtQuick 1.1 import com.nokia.meego 1.0 Item { id: settingsSwitch property alias text: theLabel.text property alias checked: theSwitch.checked width: parent.width height: theSwitch.height Label { id: theLabel anchors.left: parent.left anchors.right: theSwitch.left elide: Text.ElideRight anchors.verticalCenter: parent.verticalCenter } Switch { id: theSwitch anchors.right: parent.right } } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/WindowWindow.qml0000644000175000017500000000060212220076757027212 0ustar thpthp00000000000000 import com.nokia.meego 1.0 PageStackWindow { property bool fullsize: (platformWindow.viewMode == WindowState.Fullsize) // Unused boolean activity variables: // - platformWindow.visible - Visible somewhere // - platformWindow.active - Active (input focus?) // Hide status bar in landscape mode showStatusBar: screen.currentOrientation == Screen.Portrait } gpodder-3.5.2/share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/qmldir0000644000175000017500000000050612220076757025256 0ustar thpthp00000000000000ActionMenu 1.0 ActionMenu.qml InputField 1.0 InputField.qml PagePage 1.0 PagePage.qml SettingsSwitch 1.0 SettingsSwitch.qml WindowWindow 1.0 WindowWindow.qml ScrollScroll 1.0 ScrollScroll.qml ListList 1.0 ListList.qml Label 1.0 Label.qml Button 1.0 Button.qml BusyIndicator 1.0 BusyIndicator.qml InfoBanner 1.0 InfoBanner.qml gpodder-3.5.2/share/gpodder/ui/qml/sailfish/0000755000175000017500000000000012220346122020305 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/0000755000175000017500000000000012220346122021074 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/0000755000175000017500000000000012220346122022520 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/0000755000175000017500000000000012220346122023647 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/ActionMenu.qml0000644000175000017500000000135212220076757026443 0ustar thpthp00000000000000 import QtQuick 1.1 import Sailfish.Silica 1.0 Item { id: actionmenu /* ListView for which this menu is valid */ property variant listview /* Collect actions from the menu here */ default property alias content: actions.children Item { id: actions } /* Show action menu when this function is called */ function open() { pullDownMenu.open(); } anchors.fill: parent PullDownMenu { id: pullDownMenu Repeater { model: actions.children MenuItem { text: modelData.text onClicked: modelData.clicked() } } } Component.onCompleted: { pullDownMenu.parent = actionmenu.listview; } } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/BusyIndicator.qml0000644000175000017500000000012212220076757027152 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 ProgressCircle { property bool running: false } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/Button.qml0000644000175000017500000000005112220076757025647 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 Button { } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/InfoBanner.qml0000644000175000017500000000024512220076757026422 0ustar thpthp00000000000000 import com.nokia.extras 1.1 /* Right now, Sailfish Silica doesn't have an InfoBanner component */ InfoBanner { topMargin: 8 + rootWindow.__statusBarHeight } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/InputField.qml0000644000175000017500000000054212220076757026444 0ustar thpthp00000000000000 import QtQuick 1.1 import Sailfish.Silica 1.0 TextField { id: textField property string actionName: '' inputMethodHints: Qt.ImhNoAutoUppercase signal accepted() Keys.onReturnPressed: accepted() Keys.onEnterPressed: accepted() function closeVirtualKeyboard() { textField.platformCloseSoftwareInputPanel() } } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/Label.qml0000644000175000017500000000012012220076757025410 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 Label { truncationMode: TruncationMode.Fade } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/ListList.qml0000644000175000017500000000117712220076757026155 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 import QtQuick 1.1 SilicaListView { id: listView property string headerText: '' property int headerHeight: 90 property bool hasRefresh: false // Unused here, see Harmattan UI signal refresh header: Item { id: listViewHeader height: listView.headerHeight width: parent.width Text { anchors { verticalCenter: parent.verticalCenter right: parent.right margins: 20 } text: listView.headerText font.pixelSize: 30 color: "white" } } } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/PagePage.qml0000644000175000017500000000073112220076757026052 0ustar thpthp00000000000000 import QtQuick 1.1 import Sailfish.Silica 1.0 Page { id: pagePage signal closed property bool hasMenu: actions.length > 0 property bool lockToPortrait: false property alias actions: actionMenu.content property alias listview: actionMenu.listview allowedOrientations: lockToPortrait?Orientation.Portrait:Orientation.All function close() { pageStack.pop(); closed(); } ActionMenu { id: actionMenu } } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/ScrollScroll.qml0000644000175000017500000000006212220076757027013 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 ScrollDecorator { } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/SettingsSwitch.qml0000644000175000017500000000072012220076757027361 0ustar thpthp00000000000000 import QtQuick 1.1 import Sailfish.Silica 1.0 Item { id: settingsSwitch property alias text: theLabel.text property alias checked: theSwitch.checked width: parent.width height: theSwitch.height Label { id: theLabel anchors.left: parent.left anchors.right: theSwitch.left anchors.verticalCenter: parent.verticalCenter } Switch { id: theSwitch anchors.right: parent.right } } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/WindowWindow.qml0000644000175000017500000000171312220076757027041 0ustar thpthp00000000000000 import Sailfish.Silica 1.0 import QtQuick 1.1 ApplicationWindow { /*cover: Column { anchors.fill: parent anchors.topMargin: 40 spacing: 5 Image { source: '../../../../artwork/gpodder200.png'; anchors.horizontalCenter: parent.horizontalCenter } Text { font.bold: true; font.pixelSize: 15; anchors.horizontalCenter: parent.horizontalCenter; color: 'white'; text: "5 new episodes"; horizontalAlignment: Text.AlignHCenter } Text { font.bold: true; font.pixelSize: 15; anchors.horizontalCenter: parent.horizontalCenter; color: 'white'; text: "Currently playing: foo"; horizontalAlignment: Text.AlignHCenter } } CoverActionList { enabled: true CoverAction { iconSource: "artwork/btn_ffwd.png" onTriggered: player.togglePlaying() } CoverAction { iconSource: "artwork/btn_fffwd.png" onTriggered: player.nextSong() } }*/ } gpodder-3.5.2/share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/qmldir0000644000175000017500000000050612220076757025101 0ustar thpthp00000000000000ActionMenu 1.0 ActionMenu.qml InputField 1.0 InputField.qml PagePage 1.0 PagePage.qml SettingsSwitch 1.0 SettingsSwitch.qml WindowWindow 1.0 WindowWindow.qml ScrollScroll 1.0 ScrollScroll.qml ListList 1.0 ListList.qml Label 1.0 Label.qml Button 1.0 Button.qml BusyIndicator 1.0 BusyIndicator.qml InfoBanner 1.0 InfoBanner.qml gpodder-3.5.2/share/gpodder/ui/qml/Action.qml0000644000175000017500000000011312220076757020444 0ustar thpthp00000000000000 import QtQuick 1.1 Item { property string text signal clicked } gpodder-3.5.2/share/gpodder/ui/qml/EpisodeActionItem.qml0000644000175000017500000000151512220076757022603 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config SelectableItem { property string text: '' property string image: '' width: icon.width + Config.smallSpacing * 3 + text.width Image { id: icon source: parent.image?('artwork/episode-' + parent.image + '.png'):'' height: Config.iconSize width: Config.iconSize anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left anchors.leftMargin: Config.smallSpacing } Label { id: text text: parent.text color: 'white' font.pixelSize: 20*Config.scale anchors.left: icon.right anchors.leftMargin: Config.smallSpacing anchors.verticalCenter: parent.verticalCenter anchors.rightMargin: Config.smallSpacing } } gpodder-3.5.2/share/gpodder/ui/qml/EpisodeActions.qml0000644000175000017500000000345112220076757022150 0ustar thpthp00000000000000 import QtQuick 1.1 import 'config.js' as Config Rectangle { id: episodeActions color: Config.episodeActionsColorBg property variant episode: undefined property bool playing: false height: Config.listItemHeight Row { anchors.centerIn: parent EpisodeActionItem { height: episodeActions.height text: _('Download') image: 'download' onSelected: controller.downloadEpisode(episode.episode) visible: (episode!==undefined)?(!episode.downloaded && !episode.downloading):false } EpisodeActionItem { height: episodeActions.height text: _('Cancel') image: 'download-cancel' onSelected: controller.cancelDownload(episode.episode) visible: (episode!==undefined)?(!episode.downloaded && episode.downloading):false } EpisodeActionItem { height: episodeActions.height text: (episode!==undefined)?(episodeActions.playing?_('Pause'):(episode.downloaded?_('Play'):_('Stream'))):'' image: (episode!==undefined)?(episodeActions.playing?'pause':'play'):'' onSelected: main.togglePlayback(episode.episode) visible: episode!==undefined } EpisodeActionItem { height: episodeActions.height text: _('Delete') image: 'delete' onSelected: controller.deleteEpisode(episode.episode) visible: (episode!==undefined)?(episode.downloaded && !episode.archive):false } EpisodeActionItem { height: episodeActions.height text: _('Shownotes') image: 'shownotes' onSelected: main.openShowNotes(episode.episode) visible: episode!==undefined } } } gpodder-3.5.2/share/gpodder/ui/qml/EpisodeItem.qml0000644000175000017500000000637112220076757021452 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config import 'util.js' as Util SelectableItem { id: episodeItem property bool playing: false property real playbackPosition: playing?mediaPlayer.position:position property real playbackDuration: duration?duration:(playing?mediaPlayer.duration:0) height: Config.listItemHeight Rectangle { anchors { left: parent.left top: parent.top bottom: parent.bottom } visible: downloading || (playbackPosition && (episodeItem.playing || !episodeItem.inSelection)) width: parent.width * (downloading?(progress):(playbackPosition / duration)) color: downloading?Config.downloadColorBg:Config.playbackColorBg } Image { id: icon opacity: { if (downloaded) { 1 } else { .5 } } source: { if (episodeModel.is_subset_view) { cover_url } else if (downloading) { 'artwork/' + filetype + '-downloading.png' } else if (episodeItem.playing && true/*!episodeItem.inSelection*/) { 'artwork/' + filetype + '-playing.png' } else { 'artwork/' + filetype + '.png' } } sourceSize { width: Config.iconSize height: Config.iconSize } width: Config.iconSize height: Config.iconSize anchors { verticalCenter: parent.verticalCenter left: parent.left leftMargin: Config.largeSpacing } cache: true asynchronous: true } Column { anchors { left: icon.right right: parent.right leftMargin: Config.largeSpacing rightMargin: Config.smallSpacing verticalCenter: parent.verticalCenter } Label { id: labelTitle anchors { left: parent.left right: parent.right } text: title wrapMode: Text.NoWrap color: { if (downloading) { Config.downloadColor } else if (episodeItem.playing) { Config.playbackColor } else if (isnew && !downloaded) { Config.newColor } else if (episodeItem.inSelection) { Config.selectColor } else if (isnew && downloaded) { 'white' } else { '#999' } } font.pixelSize: Config.listItemHeight * .35 } Label { text: { if (episodeItem.playbackDuration && episodeItem.playbackPosition) { Util.formatPosition(episodeItem.playbackPosition, episodeItem.playbackDuration) } else if (episodeItem.playbackDuration) { Util.formatDuration(episodeItem.playbackDuration) } else { '-' } } font.pixelSize: Config.listItemHeight * .2 color: labelTitle.color } } } gpodder-3.5.2/share/gpodder/ui/qml/EpisodeList.qml0000644000175000017500000001256212220076757021466 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import com.nokia.meego 1.0 import 'config.js' as Config Item { id: episodeList property string currentFilterText property string mainState property alias model: listView.model property variant listview: listView clip: true /*onMainStateChanged: { // Don't remember contentY when leaving episode list listView.lastContentY = 0; }*/ property alias moving: listView.moving property alias count: listView.count property alias listViewContentY: listView.contentY signal episodeContextMenu(variant episode) function showFilterDialog() { filterDialog.open(); } function resetSelection() { listView.openedIndex = -1 } Text { anchors.centerIn: parent color: 'white' font.pixelSize: 30 horizontalAlignment: Text.AlignHCenter text: { if (main.loadingEpisodes) { '' + _('Loading episodes') + '' } else { '' + _('No episodes') + '' + '
' + _('Touch to change filter') + '' } } visible: !listView.visible MouseArea { anchors.fill: parent onClicked: { if (!main.loadingEpisodes) { episodeList.showFilterDialog() } } } } ListList { headerText: main.currentPodcast === undefined ? "" : main.currentPodcast.qtitle id: listView cacheBuffer: 10000 property real lastContentY: 0 onContentYChanged: { // Keep Y scroll position when deleting episodes (bug 1660) if (contentY === 0) { if (lastContentY > 0) { contentY = lastContentY; } } else if (episodeList.mainState === 'episodes') { // Only store scroll position when the episode list is // shown (avoids overwriting it in onMainStateChanged) lastContentY = contentY; } } anchors.fill: parent property int openedIndex: -1 visible: count > 0 Connections { target: main onLoadingEpisodesChanged: { if (main.loadingEpisodes) { listView.openedIndex = -1; } } } delegate: EpisodeItem { id: episodeItem property variant modelData: episode property bool playing: (episode === mediaPlayer.episode) && mediaPlayer.playing inSelection: (index === listView.openedIndex) opacity: { if ((listView.openedIndex === -1) || inSelection) { 1 } else { .3 } } height: Config.listItemHeight width: listView.width onSelected: { if (listView.openedIndex !== -1) { listView.openedIndex = -1 } else { listView.openedIndex = index } } onContextMenu: episodeList.episodeContextMenu(episode) } } EpisodeActions { id: episodeActions visible: (listView.openedIndex !== -1) && listView.visible episode: episodeListModel.get(listView.openedIndex) playing: { if (episode !== undefined) { (episode.episode === mediaPlayer.episode) && mediaPlayer.playing } else { false } } property alias modelData: episodeActions.episode anchors { top: parent.top topMargin: { var overlayIndex = listView.openedIndex + 1 if (listView.count === listView.openedIndex + 1 && listView.height < listView.contentHeight) { overlayIndex = listView.openedIndex - 1 } overlayIndex * Config.listItemHeight - listView.contentY + listView.headerHeight } left: parent.left right: parent.right } } Image { id: archiveIcon source: 'artwork/episode-archive.png' visible: (listView.openedIndex !== -1) && model.get(listView.openedIndex).archive sourceSize { width: Config.iconSize height: Config.iconSize } anchors { top: parent.top topMargin: { (listView.openedIndex + 1) * Config.listItemHeight - height - Config.smallSpacing - listView.contentY } left: parent.left } } ScrollScroll { flickable: listView } SelectionDialog { id: filterDialog titleText: _('Show episodes') function resetSelection() { selectedIndex = episodeModel.getFilter(); accepted(); } onAccepted: { episodeList.currentFilterText = model.get(selectedIndex).name; episodeModel.setFilter(selectedIndex); } model: ListModel {} Component.onCompleted: { var filters = controller.getEpisodeListFilterNames(); for (var index in filters) { model.append({name: filters[index]}); } resetSelection(); } } } gpodder-3.5.2/share/gpodder/ui/qml/Main.qml0000644000175000017500000004770012220076757020130 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import com.nokia.meego 1.0 import 'config.js' as Config import 'util.js' as Util Item { id: main focus: true function _(x) { return controller.translate(x) } function n_(x, y, z) { return controller.ntranslate(x, y, z) } property alias multiEpisodesSheetOpened: multiEpisodesSheet.opened property variant currentPodcast: undefined property bool hasPodcasts: podcastList.hasItems property alias currentFilterText: episodeList.currentFilterText property variant podcastListView: podcastList.listview property bool playing: mediaPlayer.playing property bool hasPlayButton: ((mediaPlayer.episode !== undefined)) && !progressIndicator.opacity property bool hasSearchButton: !progressIndicator.opacity property bool loadingEpisodes: false function clearEpisodeListModel() { /* Abort loading when clearing list model */ episodeListModelLoader.running = false; loadingEpisodes = true; episodeListModel.clear(); } Timer { id: episodeListModelLoader /** * These values determined by non-scientific experimentation, * feel free to tweak depending on the power of your device. * * Loads items every ms, and to populate * the first screen, loads items on start. **/ property int initialStepSize: 13 property int stepSize: 4 interval: 50 property int count: 0 property int position: 0 repeat: true triggeredOnStart: true onTriggered: { var step = (position === 0) ? initialStepSize : stepSize; var end = Math.min(count, position+step); for (var i=position; i 0) text: counters.downloadedEpisodes color: "white" font.pixelSize: Config.headerHeight * .5 } BusyIndicator { id: spinner anchors { right: parent.right rightMargin: Config.smallSpacing verticalCenter: parent.verticalCenter } visible: main.currentPodcast.qupdating running: visible } } Rectangle { id: horizontalLine height: 1 border.width: 0 color: Config.sectionHeaderColorLine width: parent.width - Config.largeSpacing } } EpisodeList { id: episodeList width: parent.width anchors { top: episodesHeader.bottom bottom: parent.bottom } model: ListModel { id: episodeListModel } onEpisodeContextMenu: controller.episodeContextMenu(episode) } listview: episodeList.listview onClosed: { episodeList.resetSelection(); main.currentPodcast = undefined; } actions: [ Action { text: _('Now playing') onClicked: { main.clickPlayButton(); } }, Action { text: _('Filter:') + ' ' + mainObject.currentFilterText onClicked: { mainObject.showFilterDialog(); } }, Action { text: _('Update') onClicked: { controller.updatePodcast(main.currentPodcast) } }, Action { text: _('Download episodes') onClicked: { main.showMultiEpisodesSheet(text, _('Download'), 'download'); } }, Action { text: _('Playback episodes') onClicked: { main.showMultiEpisodesSheet(text, _('Play'), 'play'); } }, Action { text: _('Delete episodes') onClicked: { main.showMultiEpisodesSheet(text, _('Delete'), 'delete'); } } ] } Item { id: overlayInteractionBlockWall anchors.fill: parent z: 2 opacity: (inputDialog.opacity || progressIndicator.opacity)?1:0 Behavior on opacity { NumberAnimation { duration: Config.slowTransition } } MouseArea { anchors.fill: parent onClicked: { if (progressIndicator.opacity) { // do nothing } else if (inputDialog.opacity) { inputDialog.close() } } } Rectangle { anchors.fill: parent color: 'black' opacity: .7 } Image { anchors.fill: parent source: 'artwork/mask.png' } } PagePage { id: mediaPlayerPage lockToPortrait: mainPage.lockToPortrait MediaPlayer { id: mediaPlayer anchors { left: parent.left right: parent.right verticalCenter: parent.verticalCenter } } actions: [ Action { text: _('Shownotes') onClicked: main.openShowNotes(mediaPlayer.episode) }, Action { text: _('Play queue') onClicked: { if (mediaPlayer.hasQueue) { mediaPlayer.showQueue(); } else { main.showMessage(_('Playlist empty')); } } } ] } ContextMenu { id: hrmtnContextMenu property variant items: [] MenuLayout { Repeater { model: hrmtnContextMenu.items MenuItem { text: modelData.caption onClicked: { hrmtnContextMenu.close() controller.contextMenuResponse(index) } } } } } function showMessage(message) { infoBanner.text = message; infoBanner.show(); } function showInputDialog(message, value, accept, reject, textInput) { inputDialogText.text = message inputDialogField.text = value inputDialogAccept.text = accept inputDialogReject.text = reject inputDialogField.visible = textInput if (textInput) { inputSheet.open() } else { queryDialog.open() } } QueryDialog { id: queryDialog acceptButtonText: inputDialogAccept.text rejectButtonText: inputDialogReject.text message: inputDialogText.text onAccepted: inputDialog.accept() onRejected: inputDialog.close() } Sheet { id: multiEpisodesSheet property string action: 'delete' property bool opened: false property string title: '' acceptButtonText: _('Delete') anchors.fill: parent anchors.topMargin: -36 rejectButtonText: _('Cancel') onAccepted: { controller.multiEpisodeAction(multiEpisodesList.selected, action); multiEpisodesSheet.opened = false; } onRejected: { multiEpisodesSheet.opened = false; } content: Item { anchors.fill: parent ListView { id: multiEpisodesList property variant selected: [] anchors.fill: parent model: episodeList.model delegate: EpisodeItem { property variant modelData: episode inSelection: multiEpisodesList.selected.indexOf(index) !== -1 onSelected: { var newSelection = []; var found = false; for (var i=0; i 0 } } } gpodder-3.5.2/share/gpodder/ui/qml/MediaPlayer.qml0000644000175000017500000002576412220076757021446 0ustar thpthp00000000000000 import QtQuick 1.1 import QtMultimediaKit 1.1 import org.gpodder.qmlui 1.0 import com.nokia.meego 1.0 import 'config.js' as Config import 'util.js' as Util Item { id: mediaPlayer height: (Config.largeSpacing * 4) + (150 * Config.scale) + 110 property variant episode: undefined property real position: audioPlayer.position/1000 property real duration: audioPlayer.duration/1000 property variant playQueue: [] property int startedFrom: 0 property bool hasQueue: playQueue.length > 0 function showQueue() { playQueueDialog.showQueue(); } onStartedFromChanged: { console.log('started from: ' + startedFrom) } function playedUntil(position) { console.log('played until: ' + parseInt(position)) controller.storePlaybackAction(episode, startedFrom, position) } function nextInQueue() { if (playQueue.length > 0) { var episode = playQueue[0]; togglePlayback(episode); controller.releaseEpisode(episode); playQueue = playQueue.slice(1); } } Connections { target: mediaButtonsHandler onPlayPressed: togglePlayback(episode) onPausePressed: togglePlayback(episode) onPreviousPressed: playbackBar.backward() onNextPressed: playbackBar.forward() } property bool playing: audioPlayer.playing && !audioPlayer.paused onPlayingChanged: episode.qplaying = playing MouseArea { // clicks should not fall through! anchors.fill: parent } Audio { id: audioPlayer property bool seekLater: false onPositionChanged: { if (episode !== undefined) { episode.qposition = position/1000 } } onDurationChanged: { if (duration > 0 && episode !== undefined) { episode.qduration = duration/1000 } } onStatusChanged: { if (episode === undefined) { return; } if (status == 6 && seekLater) { position = episode.qposition*1000 seekLater = false mediaPlayer.startedFrom = position/1000 } else if (status == 7) { mediaPlayer.playedUntil(audioPlayer.position/1000) mediaPlayer.nextInQueue(); } } function setPosition(position) { if (episode === undefined) { return; } if (!playing) { playing = true } else { mediaPlayer.playedUntil(audioPlayer.position/1000) } episode.qposition = position*episode.qduration audioPlayer.position = position*episode.qduration*1000 mediaPlayer.startedFrom = audioPlayer.position/1000 } } function enqueueEpisode(episode) { controller.acquireEpisode(episode); playQueue = playQueue.concat([episode]); } function removeQueuedEpisodesForPodcast(podcast) { if (mediaPlayer.episode !== undefined && podcast.equals(mediaPlayer.episode.qpodcast)) { // Stop playback if currently playing an episode in the podcast togglePlayback(undefined); } var newQueue = []; for (var i in playQueue) { if (playQueue[i].qpodcast.equals(podcast)) { controller.releaseEpisode(playQueue[i]); } else { newQueue.push(playQueue[i]); } } playQueue = newQueue; } function removeQueuedEpisode(episode) { if (mediaPlayer.episode !== undefined && episode.equals(mediaPlayer.episode)) { // Stop playback if the deleted epiosde is currently played togglePlayback(undefined); } var newQueue = []; for (var i in playQueue) { if (playQueue[i].equals(episode)) { controller.releaseEpisode(playQueue[i]); } else { newQueue.push(playQueue[i]); } } playQueue = newQueue; } function togglePlayback(episode) { controller.currentEpisodeChanging(episode); if (mediaPlayer.episode == episode && audioPlayer.status !== 7) { if (audioPlayer.paused) { mediaPlayer.startedFrom = audioPlayer.position/1000 } audioPlayer.paused = !audioPlayer.paused if (audioPlayer.paused) { mediaPlayer.playedUntil(audioPlayer.position/1000) } return } if (mediaPlayer.episode !== undefined) { controller.releaseEpisode(mediaPlayer.episode); } audioPlayer.paused = true mediaPlayer.episode = episode audioPlayer.stop() if (episode === undefined) { nextInQueue(); return; } controller.acquireEpisode(episode) audioPlayer.source = episode.qsourceurl audioPlayer.playing = true audioPlayer.paused = false if (episode.qposition && episode.qposition != episode.qduration) { audioPlayer.seekLater = true } } function stop() { audioPlayer.stop() audioPlayer.source = '' } MultiSelectionDialog { id: playQueueDialog function showQueue() { selectedIndexes = []; model.clear(); for (var index in playQueue) { var episode = playQueue[index]; model.append({'name': episode.qtitle, 'position': index}); } open(); } onAccepted: { /** * FIXME: If things have been removed from the play queue while * the dialog was open, we have to subtract the values in * selectedIndexes by the amount of played episodes to get the * right episodes to delete. This is not yet done here. * We can know from the nextInQueue() function (hint, hint) **/ var newQueue = []; for (var queueIndex in playQueue) { var episode = playQueue[queueIndex]; var shouldRemove = false; for (var index in selectedIndexes) { var pos = model.get(selectedIndexes[index]).position; if (queueIndex === pos) { shouldRemove = true; break; } } if (shouldRemove) { controller.releaseEpisode(episode); /* Implicit removal by absence of newQueue.push() */ } else { newQueue.push(episode); } } playQueue = newQueue; } titleText: _('Play queue') acceptButtonText: _('Remove') model: ListModel { } } Rectangle { id: mediaPlayerMain anchors.fill: mediaPlayer color: Config.mediaPlayerColorBg Column { spacing: Config.smallSpacing anchors { fill: parent margins: Config.largeSpacing } Label { id: episodeTitle text: (episode!=undefined)?episode.qtitle:'' color: 'white' font.pixelSize: 30 * Config.scale width: parent.width } Label { id: podcastTitle text: (episode!=undefined)?episode.qpodcast.qtitle:'' color: '#aaa' font.pixelSize: 20 * Config.scale width: parent.width } Item { height: 1; width: 1 } Row { spacing: Config.largeSpacing width: parent.width Image { id: coverArt width: 150 * Config.scale height: 150 * Config.scale source: (episode!==undefined)?episode.qpodcast.qcoverart:'' MouseArea { anchors.fill: parent onClicked: mediaPlayer.togglePlayback(episode) } Rectangle { anchors.fill: parent visible: audioPlayer.paused color: '#dd000000' ScaledIcon { anchors.centerIn: parent source: 'artwork/play.png' } } sourceSize.width: width sourceSize.height: height } Item { height: coverArt.height width: parent.width - coverArt.width - Config.largeSpacing PlaybackBar { id: playbackBar anchors.centerIn: parent Timer { id: resetSeekButtonPressed interval: 200 onTriggered: progressBar.seekButtonPressed = false } function seek(diff) { if (episode != undefined && episode.qduration > 0) { var pos = (episode.qposition + diff)/episode.qduration if (pos < 0) pos = 0 audioPlayer.setPosition(pos) progressBar.seekButtonPressed = true progressBar.seekButtonPosition = (episode.qposition/episode.qduration) resetSeekButtonPressed.restart() } } onForward: seek(60) onBackward: seek(-60) onSlowForward: seek(10) onSlowBackward: seek(-10) } } } PlaybackBarProgress { id: progressBar overrideDisplay: playbackBar.pressed overrideCaption: playbackBar.caption isPlaying: mediaPlayer.playing progress: (episode != undefined)?(episode.qduration?(episode.qposition / episode.qduration):0):0 duration: (episode != undefined)?episode.qduration:0 width: parent.width onSetProgress: { audioPlayer.setPosition(progress) audioPlayer.paused = false } } } Label { y: progressBar.y - height - Config.smallSpacing anchors { right: parent.right rightMargin: Config.largeSpacing } color: '#aaa' text: (episode!=undefined)?(Util.formatDuration(episode.qposition) + ' / ' + Util.formatDuration(episode.qduration)):'-' font.pixelSize: 15 * Config.scale } } } gpodder-3.5.2/share/gpodder/ui/qml/PlaybackBar.qml0000644000175000017500000000273112220076757021412 0ustar thpthp00000000000000import QtQuick 1.1 import 'config.js' as Config Row { id: root property bool pressed: backward.pressed || forward.pressed || slowBackward.pressed || slowForward.pressed property string caption caption: { if (backward.pressed) { '- ' + controller.formatCount(n_('%(count)s minute', '%(count)s minutes', 1), 1) } else if (forward.pressed) { '+ ' + controller.formatCount(n_('%(count)s minute', '%(count)s minutes', 1), 1) } else if (slowBackward.pressed) { '- ' + controller.formatCount(n_('%(count)s second', '%(count)s seconds', 10), 10) } else if (slowForward.pressed) { '+ ' + controller.formatCount(n_('%(count)s second', '%(count)s seconds', 10), 10) } else { '' } } signal forward() signal backward() signal slowForward() signal slowBackward() height: 64 * Config.scale PlaybackBarButton { id: backward source: 'artwork/btn_fffwd.png' rotation: 180 onClicked: root.backward() } PlaybackBarButton { id: slowBackward source: 'artwork/btn_ffwd.png' rotation: 180 onClicked: root.slowBackward() } PlaybackBarButton { id: slowForward source: 'artwork/btn_ffwd.png' onClicked: root.slowForward() } PlaybackBarButton { id: forward source: 'artwork/btn_fffwd.png' onClicked: root.forward() } } gpodder-3.5.2/share/gpodder/ui/qml/PlaybackBarButton.qml0000644000175000017500000000212612220076757022604 0ustar thpthp00000000000000 import QtQuick 1.1 import 'config.js' as Config Image { signal clicked() property alias pressed: mouseArea.pressed width: 64 * Config.scale height: 64 * Config.scale MouseArea { id: mouseArea property real accumulatedDistance: 0 property real lastX: 0 property real lastY: 0 anchors.fill: parent onClicked: parent.clicked() onPressed: { console.log('pressed'); accumulatedDistance = 0; lastX = mouse.x; lastY = mouse.y; } onPositionChanged: { accumulatedDistance += Math.sqrt(Math.pow(lastX - mouse.x, 2) + Math.pow(lastY - mouse.y, 2)); if (accumulatedDistance > 120) { // Allow "scrubbing" with the button accumulatedDistance = 0; parent.clicked(); } lastX = mouse.x; lastY = mouse.y; } } Rectangle { anchors.fill: parent color: 'black' radius: Config.smallSpacing opacity: mouseArea.pressed?.5:0 } } gpodder-3.5.2/share/gpodder/ui/qml/PlaybackBarProgress.qml0000644000175000017500000001014212220076757023132 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config import 'util.js' as Util Item { id: root property real progress: 0 property int duration: 0 property real mousepos: 0 property bool seekButtonPressed: false property real seekButtonPosition: 0 property bool isPlaying: false property bool overrideDisplay: false property string overrideCaption: '' signal setProgress(real progress) height: 64 * Config.scale BorderImage { anchors { verticalCenter: parent.verticalCenter left: parent.left right: parent.right } height: 9 source: 'artwork/slider-bg.png' Rectangle { id: seekTimePreviewBackground anchors.fill: seekTimePreview color: 'black' opacity: seekTimePreview.opacity*.8 radius: Config.largeSpacing smooth: true } Label { id: seekTimePreview anchors.horizontalCenter: parent.horizontalCenter anchors.bottom: parent.top anchors.bottomMargin: Config.largeSpacing * 12 text: { if (root.overrideDisplay || !mouseArea.pressed) { ' ' + root.overrideCaption + ' ' } else { ' ' + Util.formatDuration(root.mousepos*duration) + ' ' } } font.pixelSize: 50 * Config.scale horizontalAlignment: Text.AlignHCenter color: 'white' opacity: mouseArea.pressed || root.overrideDisplay scale: opacity?1:.5 transformOrigin: Item.Bottom Behavior on opacity { PropertyAnimation { } } Behavior on scale { PropertyAnimation { } } } border { top: 2 left: 2 right: 2 bottom: 2 } BorderImage { anchors.left: parent.left anchors.top: parent.top anchors.leftMargin: parent.border.left anchors.topMargin: parent.border.top width: Math.max(1, (parent.width-parent.border.left-parent.border.right) * Math.max(0, Math.min(1, root.progress))) source: 'artwork/slider-fg.png' clip: true Image { visible: root.isPlaying || root.progress < 1 source: 'artwork/slider-dot.png' anchors.verticalCenter: parent.verticalCenter anchors.left: parent.right anchors.leftMargin: -width } } BorderImage { opacity: mouseArea.pressed || root.seekButtonPressed anchors.left: parent.left anchors.top: parent.top anchors.leftMargin: parent.border.left anchors.topMargin: parent.border.top width: Math.max(1, (parent.width-parent.border.left-parent.border.right) * Math.max(0, Math.min(1, (mouseArea.pressed?root.mousepos:root.seekButtonPosition)))) source: 'artwork/slider-seeking-fg.png' clip: true Image { source: 'artwork/slider-seeking-dot.png' anchors.verticalCenter: parent.verticalCenter anchors.left: parent.right anchors.leftMargin: -width } } } MouseArea { id: mouseArea /** * Fix to prevent page switch gesture on Sailfish Silica, see * https://lists.sailfishos.org/pipermail/devel/2013-March/000022.html **/ drag { axis: Drag.XAxis target: Item {} } anchors.fill: parent onClicked: { root.setProgress(mouse.x / root.width) } onPositionChanged: { root.mousepos = (mouse.x/root.width) if (root.mousepos < 0) root.mousepos = 0 if (root.mousepos > 1) root.mousepos = 1 } onPressed: { root.mousepos = (mouse.x/root.width) if (root.mousepos < 0) root.mousepos = 0 if (root.mousepos > 1) root.mousepos = 1 } } } gpodder-3.5.2/share/gpodder/ui/qml/PodcastItem.qml0000644000175000017500000000500412220076757021447 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config import 'util.js' as Util SelectableItem { id: podcastItem Item { id: counterBox width: Config.iconSize * 1.3 anchors { left: parent.left top: parent.top bottom: parent.bottom } Label { id: counters property int newEpisodes: modelData.qnew property int downloadedEpisodes: modelData.qdownloaded anchors { verticalCenter: parent.verticalCenter right: parent.right rightMargin: 3 } visible: !spinner.visible && (downloadedEpisodes > 0) text: counters.downloadedEpisodes color: "white" font.pixelSize: podcastItem.height * .4 } } BusyIndicator { id: spinner anchors { verticalCenter: parent.verticalCenter right: cover.left rightMargin: Config.smallSpacing } visible: modelData.qupdating running: visible } Item { visible: counters.newEpisodes > 0 clip: true anchors { left: cover.right leftMargin: 2 verticalCenter: cover.verticalCenter } height: cover.height width: cover.width * .25 Rectangle { anchors { verticalCenter: parent.verticalCenter horizontalCenter: parent.left } color: Config.newColor width: parent.width height: width rotation: 45 } } Image { id: cover source: modelData.qcoverart asynchronous: true width: podcastItem.height * .8 height: width sourceSize.width: width sourceSize.height: height anchors { verticalCenter: parent.verticalCenter left: counterBox.right leftMargin: Config.smallSpacing } } Label { id: titleBox text: modelData.qtitle color: (!isSailfish && counters.newEpisodes)?Config.newColor:'white' anchors { verticalCenter: parent.verticalCenter left: cover.visible?cover.right:cover.left leftMargin: Config.smallSpacing * 2 right: parent.right rightMargin: Config.smallSpacing } font.pixelSize: podcastItem.height * .35 wrapMode: Text.NoWrap } } gpodder-3.5.2/share/gpodder/ui/qml/PodcastList.qml0000644000175000017500000000430012220076757021462 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config Item { id: podcastList property variant listview: listView property alias model: listView.model property alias moving: listView.moving property bool hasItems: listView.visible signal podcastSelected(variant podcast) signal podcastContextMenu(variant podcast) signal subscribe Text { anchors.centerIn: parent color: '#aaa' font.pixelSize: 60 font.weight: Font.Light horizontalAlignment: Text.AlignHCenter text: _('No podcasts.') + '\n' + _('Add your first podcast now.') visible: !listView.visible wrapMode: Text.WordWrap width: parent.width * .8 MouseArea { anchors.fill: parent onClicked: podcastList.subscribe() } } Button { visible: !listView.visible text: _('Add a new podcast') onClicked: podcastList.subscribe() anchors { left: podcastList.left right: podcastList.right bottom: podcastList.bottom margins: 70 } } ListList { headerText: 'gPodder' hasRefresh: true onRefresh: controller.updateAllPodcasts() id: listView anchors.fill: parent visible: count > 1 section.property: 'section' section.delegate: Column { Text { font.pixelSize: Config.headerHeight * .5 wrapMode: Text.NoWrap text: section color: Config.sectionHeaderColorText anchors { left: parent.left leftMargin: Config.smallSpacing } } Rectangle { height: 1 border.width: 0 color: Config.sectionHeaderColorLine width: listView.width - Config.largeSpacing } } delegate: PodcastItem { onSelected: podcastList.podcastSelected(item) onContextMenu: podcastList.podcastContextMenu(item) } cacheBuffer: height } ScrollScroll { flickable: listView } } gpodder-3.5.2/share/gpodder/ui/qml/ScaledIcon.qml0000644000175000017500000000020612220076757021236 0ustar thpthp00000000000000 import QtQuick 1.1 import 'config.js' as Config Image { width: Config.iconSize height: Config.iconSize smooth: true } gpodder-3.5.2/share/gpodder/ui/qml/SearchResultsListModel.qml0000644000175000017500000000072512220076757023644 0ustar thpthp00000000000000 import QtQuick 1.1 /** * XmlListModel exposing the podcasts in an OPML file: * - title * - description * - url **/ XmlListModel { query: '//podcast' XmlRole { name: 'title'; query: 'title/string()' } XmlRole { name: 'description'; query: 'description/string()' } XmlRole { name: 'url'; query: 'url/string()' } XmlRole { name: 'subscribers'; query: 'subscribers/string()' } XmlRole { name: 'logo'; query: 'scaled_logo_url/string()' } } gpodder-3.5.2/share/gpodder/ui/qml/SelectableItem.qml0000644000175000017500000000122012220076757022111 0ustar thpthp00000000000000 import QtQuick 1.1 import 'config.js' as Config Item { id: selectableItem signal selected(variant item) signal contextMenu(variant item) property bool pressed: mouseArea.pressed property bool inSelection: false height: Config.listItemHeight width: parent.width Rectangle { id: selectionHighlight anchors.fill: parent visible: selectableItem.inSelection color: Config.selectColorBg opacity: .5 } MouseArea { id: mouseArea anchors.fill: parent onClicked: parent.selected(modelData) onPressAndHold: parent.contextMenu(modelData) } } gpodder-3.5.2/share/gpodder/ui/qml/SettingsHeader.qml0000644000175000017500000000151412220076757022146 0ustar thpthp00000000000000 import QtQuick 1.0 import 'config.js' as Config Item { id: settingsHeader property alias text: headerCaption.text property color color: Config.settingsHeaderColor width: parent.width height: headerCaption.visible?Config.listItemHeight*.7:10 Rectangle { id: horizontalLine anchors { left: parent.left right: headerCaption.left rightMargin: headerCaption.visible?Config.smallSpacing:0 verticalCenter: headerCaption.verticalCenter } height: 1 color: settingsHeader.color } Text { id: headerCaption text: '' visible: text !== '' color: settingsHeader.color font.pixelSize: 17 anchors { right: parent.right bottom: parent.bottom } } } gpodder-3.5.2/share/gpodder/ui/qml/SettingsLabel.qml0000644000175000017500000000012312220076757021770 0ustar thpthp00000000000000 import org.gpodder.qmlui 1.0 Label { color: '#ddd' font.pixelSize: 20 } gpodder-3.5.2/share/gpodder/ui/qml/ShowNotes.qml0000644000175000017500000000302212220076757021162 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config Rectangle { id: showNotes clip: true property variant episode: undefined MouseArea { // clicks should not fall through! anchors.fill: parent } Flickable { id: showNotesFlickable anchors.fill: parent contentHeight: showNotesText.height anchors.margins: Config.largeSpacing Label { id: showNotesText color: "black" font.pixelSize: 20 * Config.scale anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right wrapMode: Text.Wrap text: episode!=undefined?('

'+episode.qtitle+'

'+formatSubtitle()+'

'+episode.qdescription+'

'):'No episode selected' onLinkActivated: Qt.openUrlExternally(link) function formatSubtitle() { var pubdate = episode.qpubdate; var filesize = episode.qfilesize; if (filesize !== '') { if (episode.qdownloaded) { var filename = episode.qsourceurl.split('/').pop(); return pubdate + ' | ' + filesize + ' | ' + filename; } return pubdate + ' | ' + filesize; } else { return pubdate; } } } } ScrollScroll { flickable: showNotesFlickable } } gpodder-3.5.2/share/gpodder/ui/qml/SimpleButton.qml0000644000175000017500000000116012220076757021657 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import 'config.js' as Config SelectableItem { property alias text: buttonText.text property alias image: buttonImage.source signal clicked() property string modelData: '' width: 100 height: Config.listItemHeight onSelected: clicked() Label { id: buttonText anchors.centerIn: parent color: 'white' font.pixelSize: 20 font.bold: true text: '' visible: text != '' } ScaledIcon { id: buttonImage anchors.centerIn: parent visible: source != '' } } gpodder-3.5.2/share/gpodder/ui/qml/Subscribe.qml0000644000175000017500000002025312220076757021157 0ustar thpthp00000000000000 import QtQuick 1.1 import org.gpodder.qmlui 1.0 import com.nokia.meego 1.0 import 'config.js' as Config Item { id: subscribe signal subscribe(variant urls) function show() { searchInput.text = '' searchResultsListModel.source = '' resultsSheet.reject(); } function search() { var q = searchInput.text; if (q.indexOf('http://') === 0 || q.indexOf('https://') === 0) { /* Directly subscribe to a URL */ subscribe.subscribe([q]); } else { /* Search the web directory */ searchResultsListModel.searchFor(q); resultsSheet.open(); } } onVisibleChanged: { if (!visible) { searchInput.closeVirtualKeyboard() listView.selectedIndices = [] } } Item { id: topBar visible: resultsSheet.status == DialogStatus.Closed height: 70 anchors { left: parent.left right: parent.right top: parent.top } InputField { id: searchInput placeholderText: _('Search term or URL') anchors { leftMargin: Config.smallSpacing left: parent.left right: searchButton.left verticalCenter: parent.verticalCenter } onAccepted: subscribe.search() actionName: _('Search') } SimpleButton { id: searchButton image: 'artwork/search.png' onClicked: subscribe.search() width: parent.height height: parent.height anchors { top: parent.top right: parent.right } } } Item { id: directoryButtons anchors.fill: parent anchors.bottomMargin: Config.listItemHeight Row { visible: parent.height > 200 anchors.centerIn: parent spacing: Config.largeSpacing * 3 Image { source: 'artwork/directory-toplist.png' SelectableItem { property string modelData: 'http://gpodder.org/directory/toplist.xml' anchors.fill: parent onSelected: { searchResultsListModel.source = item; resultsSheet.open(); } } Label { anchors.top: parent.bottom anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 30 color: 'white' text: _('Toplist') } } Image { source: 'artwork/directory-examples.png' SelectableItem { property string modelData: controller.myGpoEnabled?('http://' + controller.myGpoUsername + ':' + controller.myGpoPassword + '@gpodder.net/subscriptions/' + controller.myGpoUsername + '.xml'):('http://gpodder.org/directory/examples.xml') anchors.fill: parent onSelected: { searchResultsListModel.source = item; resultsSheet.open(); } } Label { anchors.top: parent.bottom anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 30 color: 'white' text: controller.myGpoEnabled?_('My gpodder.net'):_('Examples') } } } } Label { visible: directoryButtons.visible anchors.right: parent.right anchors.bottom: parent.bottom anchors.margins: Config.largeSpacing font.pixelSize: 20 color: 'white' text: '' + _('powered by gpodder.net') + '' } Sheet { id: resultsSheet anchors.fill: parent anchors.topMargin: -50 acceptButtonText: _('Subscribe') rejectButtonText: _('Cancel') content: Item { anchors.fill: parent MouseArea { anchors.fill: parent onClicked: console.log('caught') } ListView { id: listView property variant selectedIndices: [] opacity: (searchResultsListModel.status == XmlListModel.Ready)?1:0 Behavior on opacity { PropertyAnimation { } } anchors.fill: parent model: SearchResultsListModel { id: searchResultsListModel function searchFor(query) { console.log('Searching for: ' + query) source = 'http://gpodder.net/search.xml?q=' + query console.log('new source:' + source) } } delegate: SelectableItem { id: subscribeDelegate property string modelData: url inSelection: (listView.selectedIndices.indexOf(index) != -1) height: Config.listItemHeight width: listView.width Item { id: coverArt height: Config.listItemHeight width: Config.listItemHeight anchors { leftMargin: Config.largeSpacing left: parent.left verticalCenter: parent.verticalCenter } Image { anchors.centerIn: parent source: logo } } Column { anchors { leftMargin: Config.largeSpacing rightMargin: Config.largeSpacing left: coverArt.right right: parent.right verticalCenter: parent.verticalCenter } Label { id: subscribeDelegateTitle text: title + ' (' + subscribers + ')' anchors.leftMargin: Config.largeSpacing color: !subscribeDelegate.inSelection?'white':Config.selectColor font.pixelSize: 25 } Label { text: url anchors.leftMargin: Config.largeSpacing color: subscribeDelegateTitle.color font.pixelSize: 15 } } onSelected: { var position = listView.selectedIndices.indexOf(index); var tmp; var i; tmp = new Array(); for (i=0; i 0 opacity: (searchResultsListModel.status == XmlListModel.Loading)?1:0 Behavior on opacity { PropertyAnimation { } } } } onAccepted: { var urls = new Array(); var i; for (i=0; i 0 ? (h < 10 ? '0' + h : h) + ':' : '' var ms = (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s) return hh + ms } function formatPosition(position,duration) { return formatDuration(position) + " / " + formatDuration(duration) } function isScreenPortrait() { return screen.currentOrientation == Screen.Portrait || screen.currentOrientation == Screen.PortraitInverted } gpodder-3.5.2/share/gpodder/ui/web/0000755000175000017500000000000012220346122016467 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/web/images/0000755000175000017500000000000012220346122017734 5ustar thpthp00000000000000gpodder-3.5.2/share/gpodder/ui/web/images/audio.png0000644000175000017500000000102312220076757021555 0ustar thpthp00000000000000PNG  IHDR((msRGBbKGD pHYs B(xtIME/]IDATX혽NAkO6> jJ*b"THhL(c3$ 0{)vwv˝3[IגN(Xef 0%0p=3El`RMt-Ck cY`RK̿G\`(@ރ$CvH NjR} f*T`k[7poJZ"yH@s+pZ`|Uk9h]lY XJڋb_١u?!-hvIENDB`gpodder-3.5.2/share/gpodder/ui/web/gpodder.js0000644000175000017500000001402112220076757020465 0ustar thpthp00000000000000gPodder = { /* XXX: Partially ugly. Some parts would be shorter with JQuery. */ currentlySelectedPodcast: null, currentlySelectedEpisode: null, quote: function(str) { var s = String(str); s = s.replace(/&/g, '&'); s = s.replace(//g, '>'); s = s.replace(/"/g, '"'); return s; }, url: { podcasts: '/json/podcasts.json', episodes: function(podcast) { return '/json/podcast/' + podcast.id + '/episodes.json'; }, }, createEpisode: function(episode) { var li = document.createElement('li'); var a = document.createElement('a'); var img = document.createElement('img'); var wrapper = document.createElement('p'); wrapper.setAttribute('class', 'listwrapper'); if(episode.mime_type.indexOf('video') == 0) img.setAttribute('src', '/static/images/video.png'); else if(episode.mime_type.indexOf('audio') == 0) img.setAttribute('src', '/static/images/audio.png'); wrapper.appendChild(img); //img.setAttribute('class', 'ui-li-icon'); var title = document.createElement('h3'); title.appendChild(document.createTextNode(episode.title)); var description = document.createElement('p'); description.appendChild(document.createTextNode(episode.description)); a.setAttribute('gpodder:episode', JSON.stringify(episode)); a.setAttribute('data-rel', 'dialog'); a.setAttribute('data-transition', 'pop'); a.href = '#episode_details'; a.onclick = function() { gPodder.selectEpisode(this); gPodder.currentlySelectedEpisode = this; }; a.appendChild(wrapper); a.appendChild(title); a.appendChild(description); li.appendChild(a); return li; }, createPodcast: function(podcast) { var li = document.createElement('li'); var img = document.createElement('img'); img.setAttribute('src', podcast.cover_url); var title = document.createElement('h3'); title.appendChild(document.createTextNode(podcast.title)); var description = document.createElement('p'); description.appendChild(document.createTextNode(podcast.description)); var a = document.createElement('a'); a.setAttribute('gpodder:podcast', JSON.stringify(podcast)); a.href = '#episodes_page'; a.onclick = function() { gPodder.selectPodcast(this); gPodder.currentlySelectedPodcast = this; }; a.appendChild(img); a.appendChild(title); a.appendChild(description); li.appendChild(a); return li; }, init: function() { $.getJSON(gPodder.url.podcasts, function(data) { $('#podcasts').html(''); $.each(data, function() { $('#podcasts').append(gPodder.createPodcast(this)); }) $('#podcasts').listview('refresh'); }); }, selectPodcast: function(li) { var podcast = JSON.parse(li.getAttribute('gpodder:podcast')); $.getJSON(gPodder.url.episodes(podcast), function(data) { $('#episodes_title').html(podcast.title); $('#episodes').html(''); $.each(data, function() { $('#episodes').append(gPodder.createEpisode(this)); }) $('#episodes').listview('refresh'); }); }, selectEpisode: function(li) { var episode = JSON.parse(li.getAttribute('gpodder:episode')); var content = ''; if(episode.mime_type.indexOf("audio") == 0) content += '

'; else if(episode.mime_type.indexOf("video") == 0) content += '
'; // TODO: Add more fields in the dialog box (Pubdate, etc.) var published = new Date(episode.published * 1000) content += '' + episode.title + ''; //content += '
'; //content += '

Details

'; content += '

' + episode.description + '

'; content += 'Released: ' + published.toDateString() + '
'; content += 'Time: ' + published.toTimeString() + '
'; content += 'Size: ' + gPodder.bytesToSize(episode.file_size) + '
'; content += 'Link: ' + episode.link + '
'; //content += '
'; // End collapsible $('#episode_details_title').text(episode.title); $('#episode_details_content').html(content); // Pause playback if the dialog is closed $('#episode_details').bind('pagebeforehide', function() { $('#episode_player').get(0).pause(); }); // Start the player at the last saved position $('#episode_player').bind('loadedmetadata', function() { this.currentTime = episode.current_position; }); // TODO: Mark the episode as played $('#episode_player').bind('play', function() { console.log("played episode: " + episode.url); $.post('/podcast/save', function() { console.log("POSTED"); }) }); // TODO: Mark the current position $('#episode_player').bind('pause', function() { console.log("paused episode: " + episode.url + " at " + this.currentTime); }); }, bytesToSize: function(bytes) { var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; if (bytes == 0) return 'n/a'; var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; } }; gpodder-3.5.2/share/gpodder/ui/web/index.html0000644000175000017500000000315112220076757020502 0ustar thpthp00000000000000 gPodder Web UI

Podcasts

    Episodes

      Episode

      gpodder-3.5.2/share/gpodder/ui/web/style.css0000644000175000017500000000154112220076757020360 0ustar thpthp00000000000000 body { font-family: sans-serif; margin: 0px; } h1 { padding: 4px; margin: 0px; font-size: 18px; background-color: #66CC66; } h2 { display: none; } ul { list-style: none; padding: 0px; } li { padding: 5px; cursor: pointer; overflow: hidden; } #podcasts li.selected { font-weight: bold; background-color: #CC9966; color: #8A2E2E; } li:hover { background-color: #66CCCC; color: #2E8A8A; } #podcasts { position: absolute; top: 20px; left: 0px; width: 20%; } #episodes { position: absolute; top: 20px; left: 20%; width: 80%; } #episodes li.selected { font-size: 10pt; background-color: #66CC99; color: black; } .listwrapper { float: left; width: 50px; height: 50px; text-align: center; vertical-align: middle; margin: 10px; } gpodder-3.5.2/share/gpodder/credits.txt0000644000175000017500000000607012220345577017513 0ustar thpthp00000000000000Adolfo Jayme Barrientos Adrien Beaucreux Alain Tauch Alessandro Campidori Alexander Boström Alex Bennee Alex Ghitza Alistair Sutton Amiad Bareli Anders Kvist Andrea Carpineti Andreas Böttger Andreas Piesk Andrei Dolganov Andrew Bennett Andy Busch Antonio Roversi Aravind Seshadri Arne Stierman Asier Iturralde Sarasola Atheos Atte André Jensen audioworld Bastian Kleineidam Bastian Staeck Baurzhan Muftakhidinov Bernd Schlapsi Bernhard Walle Bill Barnard Bill Peters Bjørn Rasmussen Boryslav Larin brabadu bttfmcf Caleb Clarke Camille Moncelier Carlos Moffat Casey Watson Cesar Alcalde Chionsas Chris Arnold Chris Moffitt Clark Burbidge Corey Goldberg corq Cory Albrecht daggpod Daniel Ramos Daniel Sandman Daniel Schaal Danilo Shiga darkmanx David Spreen David Štancl Doug Hellmann Dov Feldstern Dudu Maroja Edouard Pellerin Eduardo Maroja Eric Le Lay Eugene Nikolsky Fabio Fiorentini FFranci72 Filip Kłębczyk Floriano Scioscia Florian Richter Frank Harper Franz Seidl Fred Kwame FriedBunny Gergely Imreh Gerrit Sangel Gherhardt Mathisz Gilles Lehoux Gonçalo Cordeiro Götz Waschk Haim Roitgrund Harry Coal hatul Heinz Erhard Hex Holger Bauer Holger Leskien Iwan van der Kleijn jaah Janne Makela Jens Persson Jens Thiele Jérôme Chabod Jerry Moss Jessica Henline Jim Nygård João Trindade Joel Calado John Ferguson John Rabotnik Jonas Kölker Jon Hedemann Jörg Thalheim José Luis Fustel Joseph Bleau Joseph Wickremasinghe Josh Mondragon Julio Acuña Junio C Hamano Jürgen Schinker Justin Forest Kitchener-Waterloo LUG Konstantin Ryabitsev kvikende Leonid Ponomarev Louis Carlioz Luigi Marco Antonio Villegas Vega Marcos Hernández Mark Alford Marko Vertainen Markus Golser Martin Kjellqvist Matt Baker Maurizio Ballo Maxim Prohorov Mehmet Nur Olcay Michael Salim Mika Leppinen Mike Coulson Mikolaj Laczynski Mohammad Dashtizadeh Mohammadreza Abdollahzadeh Morten Juhl-Johansen Zölde-Fejér Morten Nygaard Åsnes M. Schneider Mykola Nikishov narf Neal H. Walfield Nelson Ferreira Nick L. Nick Sonneveld Nick Stevens Nicolas Quienot Nikolaos Papagrigoriou Olivier Brisson Ondrej Vesely Ortwin Forster Paul Elliot Paul Rudkin Pavel Mlčoch Peter Hoffmann Peter Hultqvist PhilF Philippe Dessante Philippe Gouaillier Pieter de Decker Preben Randhol psychedelys Rafael Ferreira Rafael Proença Rafi Rubin R.Bell red26wings Richard Voigt Rigoberto Calleja Robert Willert Robert Young Roel Groeneveld Romain Janvier Salvatore Iovene Sam Freilich Scott Wegner Scott Worley Sean Munkel Sebastian Hanula Sebastian Krause Sebastian Semmler Sérgio Marques Sergio Villar Senin Seth Remington Shane Donohoe Shane Huntley Silvio Sisto Simó Albert i Beltran Simon Schubert sneakypete SPGoetze S. Rust Stefan Kögl Stefan Lohmaier Stephan Buys Steve Burdine Steve McCarthy Steven Oxley Stylianos Papanastasiou Teo Ramirez Thibauld Nion Thomas Matthijs Thomas Mills Hinkle Thomas Nilsson threexk Tim Gilbert Tim Michelsen Tim Preetz Todd Zullinger Tomas Matheson Tomasz Dominikowski Torbjörn Wassberg Torstein Adolf Winterseth Ville-Pekka Vainio Vitaliy Bondar VladDrac Vladimir Voroshilov Vladimir Zemlyakov Wilfred van Rooijen gpodder-3.5.2/share/icons/0000755000175000017500000000000012220346122014764 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/0000755000175000017500000000000012220346122016423 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/16x16/0000755000175000017500000000000012220346122017210 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/16x16/apps/0000755000175000017500000000000012220346122020153 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/16x16/apps/gpodder.ico0000755000175000017500000000217612220076757022322 0ustar thpthp00000000000000 h(  9+9C,AB,@B-@C-AC-AC-AC-AC-AC-AB,@@+>@+>C,?>+>_P5MT{U|}SxV|W}W}X~Y~}Tx|SwzQtC-A@);8A+?F.C@+>A+?C-AmHiWWsLnC-AE/CrLm@+>9+9s}3j ,+Y;VWSz:&88(5MnB,@?+=N靝eeeFB&&&!!!%%%,,,@;@)RRRC4AYYY9697)6B-A2-0ZZZ...,RqqqśWqiiigggwࣈ$$$zzz222gggcֽ侾t 3gpodder-3.5.2/share/icons/hicolor/16x16/apps/gpodder.png0000644000175000017500000000144712220076757022331 0ustar thpthp00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8OHqǿ*ɦ(sM)Q矊iCAwM%^:S9=@B%CeSRLaԁ u[{e%ee֡/<×aDcT `8MEQacfM&Ӄ_ED%IghhhFGGcKE"WD$$˲srr{kkzՄzrjj%\A0 6.5uJ&r78hj}>ߦɲL SGQ8PEEwG$yfQ*"IHQr;(LR45*// v"h V+^/ `wwZhr# bd2a}}fccctd01>A~JAPMMb\?MO3EQF#NM^;ax/iڇ "'qiܹӝ>}: EQh4J]]]a(0B-ݳt]p8LGM._sG;w.YWWGs:~x0N"eY%KP4D"J&.vz5W5L>ػw9ϛBmOɖe2C)wÇ36m:R)^}]eb]׻rUUUhnnL{ fkO>-[555c1TT( Pv]cf`pp::::=N {,* Yq$P^^YP__U"C 9dž yf$ẄT*7"1gi.ɶm͝;p%vtwwdI̛1#Kp :;; 8FFFX, ,z=yUܯ(z*FGGaYΜ9p8 8ZZ?éoO===(,,tcǎmۮiڨi+'?L󹆆LCCvmݺUFЁ>}[Ъմh"t]OE"eT\\LvʛgOX~6c, m@+|b*JX pzd2yBqdxxxvٮnn{}SJEzE1i 1(CsWՌ$(?y YYx<'<<X]ap(Ive3âl^!/,d @9 qh |^/r" /U*WqȦm3\1O" !c7ϹHoQ_٥r21˜C *W)1HHמ_Cߙ#V.^Y(j/TE1%q!q8ge;ʤD*k\2K_ ;ys1D1|k 90ɜ  $3q{dґ$<֭[SNaطo7:={IhMs****4MÚ5k X,3&8q1::KBUU `FR#PUgΜAYYnl4(6cƍu$:֮]bDQdY8U}hmmEmm- m3 r:Aww7R:;;Qu_5fMATUW^/6l؀7@fTYYFؽ{7 zET?fU r.ftttmf! K?1*&y;wNP0 5P0}t%Bm/Z/4qㅯ m^43&#-XM׫#p8q=y'#^Z֫te*BʧAt;.V;hIu3iJ!B\lI!gڶ0~W%GRP)y;:M꺃-ϝM-ނBt}H<w9ˋaf2F(6233M0^芆H`Y6R#)+deYU>5 +kA &:'{)B.ōܜ\< Y$M"!D"!qe}]m["s繋t8@⏃7[(R2ƕkWp.ڛ3Fm+g33,S:ڴJ!*RP@RJ UJ !!"a6SFRSa(B8gg;9)$>bquCdơ UQP#]5 j6.l1^r΋mT&e#Z_J7?*IENDB`gpodder-3.5.2/share/icons/hicolor/32x32/0000755000175000017500000000000012220346122017204 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/32x32/apps/0000755000175000017500000000000012220346122020147 5ustar thpthp00000000000000gpodder-3.5.2/share/icons/hicolor/32x32/apps/gpodder.png0000644000175000017500000000403612220076757022322 0ustar thpthp00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXW}lޮw&|8W ԉk &IR?RH+$Td"J+.jRʇ]DeSwwmhejVt{o~FDx?U +p@,d{C2 ;v֯_OeeeTZZJ>꨹t]EDH]6$v- zX|9܁TG8FSSnݺ;wb_x `#M""::Wxr;w4;::hʔ)LD0j:;;rQOOh洙_kq}jڟu{oP`u>}ϧ6"(Dta…+WDÇ3ΡwVz2 8 >YTq QZZJ@ر#{X<7B!Z[[<0ٙڸq400K.-`WɁ޽VXA%%%D"Dsw>_D{h4JXb͟?^/UTT޽{vLg"~`N3{ٲeP!B0ĵ+)M6!#}R766R^^)B#ow^^A1u4e2d2 IUU@DD'7n`xxNEQP % av748X&zB1UV ϟP8,iYGII *++aYp8d2D& H) q@KK ؇BwJKq9~q躎X,)%̙Yf!N;G2psŌ3PXXÁzP4̓6l@,C:QUU(oȝ,Jlٲ7oƉ'`ׇ!:^gmm(//ױ}v?~8gkٰvڜj``)&*p޺ukٚ5kx$AmM-^}3=em; 4Q[[D"ͩT'O"鲢(u iZϒ%KxOO*T > i!Α]Ĵ{gϞ ۶mrR"C3e%;ΟKDFe ݦoh6eQ˕~ɏ Z#1Y Ӹ= ,**JDc}ୡD&BtY8n}j4 P I<<_t]Ņ12S"5˒ BRʧWba3d9` ,ظ 64Lpg<9P`-,񔰙9n)-p91i&BA6I5"FRΝ$tTEC0B΍RN˞Ne0 c`dTit,~aP5Ҥ#t7Q P용4MHC<q-xE[p{;5> 9h|c/63cwFd= d Oōdb1C7ӿIa1|)Lq6ŪBClL9w1`cB%9 ] 4IޖBw$3-q)T۳cG`1(pXl6Ų,U\)02Hm2F&衛siY"eITLSJUJ&%O&3a" ===&=pHaso̝s2"YN! +}&x={x~?RRR: 4!k."wAFwś3337n<3\ ᵓ0.s"DQ4˨YwmcҤIزe^`=P'UU 6Ѐ.'O+Ek^Bݻ)Ćl0a\.Zb:thʃAoKKKm0 a̙3Fzz:d·`h //MӰzj;v x뭷P[[ iwZJr,\PuKpUU1w\\h=m0,{G((,,"漡/^N>.pcE!( \.*`C~b?c>|x,SSS1# 1pΑii7-BRRc8x Fs碭 qqq$)ڃ͢E0tP@J q ƛ3i\ۍe˖ٳ8~8 $O2z'Ňa6N82@uu50MMcc#((OrK( ZZZ`&bϥ8SpjNx=^:u @ 6gȑB WFNN;r[;vɠeY8tcXjt]Cqq1vVDVGaۛ0l0!77֭C4EMMdɒO>۶m g^m%,ONKKCss3QYY xrrrs0  MMMM >1~xm9H0&c\̨־'O;wnm `˗WWWׯǴi^ۻn RRRuVWZZ֬YCg~[+bwheEEEG}}}zyW\3g= LLw<Lq.Ruw}髿lkmmt:?裏zV42{eACѺM3Gn=3sss]HdY`߻O7 tA2t`8a{:Y y1o]x<.t5E*f-^+cD_$o;;#ܩ; Wݟ}Y?lڎ8TEQaeۜs-k$/ i\t;FtP3#oqn'n'\.9݈sAcl[@mBU`G4ľ wDuF%U1B$MDԨɊZ&,xy47a ^#A0'«RJP1 D8CAQ4؂%(b`kH[Ʒ;\Ut݁B@t?\;:ۖ;ZuU~f] 36x@Vo,RrII \.X]׹Kff^ڭ`MfN?>`"S빶k*k>wWWWs̉[pa?,O\]WWcƌadnnnffnݵGEMrŊ;v,:"e7f1~+F^^މ."z<3=BYGzʝ8=2!!?G 6ɓxꩧ`̀nX]]\L6 fZZl6jQ4 8Ғf<';Z4[vmL|||L4 ˗/j۶m(tшqوOd=z4Z[[UUU8vЛЭ.DKKc޼yABy@SG f >tRDEEE655 |[6:ॗ^B}}=`ӦM9s&Lv3cʔ)qA$''C޵"ӦMizs;ۍťhԙ48NH Dvvv|477#... ළPSzzݎٌC4M "?F)@)"aHIIl7.a"#...>s /^ { "l6,&ttuuE[ZZ0f<Ø5k677\ҮcYzzzPJaʕ(--ECCyv# !ڌFjH9T_f GKrKHJn(p>ӧqGB B+}:V\6=(++}Æ HHH@ZZz-8.݃ثǥOwBJu!55O<6o )%a:=EEEXj:;; ?Co=CFwvݻ#G^Cuu5RRR@Dx,[wȑ>XWfx</"nݺ>'iO'&&nyӦMÇ~ 7'Ļ􇆌6¯?~Ϛ>=7TQQADtv3c~\CAAxN-r:z<;3'|DtR>f8r2'ْ) a3@ 4! J*H - }+ t 0O*u4A!$4}،wd@I)4M {`R %X1툋!L;=(@8FW[wo A(2پHo3 3;5AdD "z hC4J*jNzW @5 vDu 0 {T ThY1,eA})BEFo7D4Ci7թ3t R Y1l&(D/ݝv/K@ٹQю(`kAh(VBFԟ;ᵤ.x<޺vR76nܸhӌwT|3!irJHeM$0aM C7a&tMbKPI(f(`V` nY ~myna)KB`RM u4L +utR^ByyboR7.z*bcIQ.4p(1Gh$)bH)$K@,+(7CvRn%eƐDJ"&"%@!X$!:?!-/6AF։{~.MX >Li%4MXR`IIiJJSBSB(RB4&f!`fDLJ)"RY !IJHJҥ$CC4 #t1I%-ZΟ?/:bc5-NrZYERJ2T$)%))ɡ${Td,45uMc4 >w\H\P=8%ap$pxC2ɓFpRJ yyy3f rrrNx4N̷d#Ǐ gf Ǎ֭H$daf6y-  UUUO̟?6oތ8"Bnn. 0 (qP^^cǎèK0ݻ7/_ɓ'P `-\)W_}ՌӇ_xp3`Cp민j/^{42{lRXTTp8}СC7 nFx7B/ cŊD4-EUSV n_!lE,ƒ@n^'AZ2&"8iʔ)KJJ@D8q|I/ s,X(((e. $a5j:>=b ѫo+H&'뇉hqNN 'O3֯_͛7|&psӒ%Kߏuֱ(Qj beeo鵣v&̀Jt }5Wg̘1$==}N4iҥKCO}@={$˲bҥ۪|oqqҥKxW;`jt yOf"Pt*.|?(1({1wߍlܸ;s>|7Fѳ@ʕ+ɲ,hyEYiZ~ii~,^5df#ߵ3۶u[6Xp!b֭S|n]co8q"u} 3Zf2p@! A'xtZ1X+V@QxzذayΏ?w^xx@/#G8;u]ќ9sh !`V\ uQ~V OVcҤImZ˒~Z۲eKnnn.?Ɗ+0ѣGp8 SO=FmoY܉3fK(((hշ=O<k˘?>~ӟbϞ=eiy`Bii|'xԇqM#p@ryyymf=+xn(o>|x'|ݻw'*gϞ )% [y1d$Qu =:g [׮P՘(Df\˺AAUU8NkGzY,#[t)|Vҥu3sBTH->qj8@ #GQ 8>t|rJJ*,ۺ"5Zid8waGjUUw~E)0m3g4X ۶I )%ΝdɒD{{QPx>Q__)eBhhv]?};.1+jȑ#;vnuӧOCJ )%\mQH$gffաu]'ڵk >qGuMu@πG 퍯J_}>n~6UU{*]E]]]B04F .((3. @,ӄp=z@ˣp-Z)%= EQKKeuƎ˲ L88edd$33v-=>}:t(v uBTgSGhVTTJzo6l3f իpEEV-Xx饗20MT@udee!;;ؼy3n݊>G޽ѫW/H)qڵ ?ҊijRgzK/"۷ B$C`Y`wy%Kb?doI _Bo'%%?1`MsIPq\nwFmSlI"5%ݣ],d_vT1cƨN-@"ԉ ه5,^x w}JYu=qQtO??20ł.Q+H[UWr̾nݭY{ QeCByt>}ڵ<4!ǵ08\os/8fh75sUϬNŋFƅHw˟ЩBj.U?i"T4 #i_RזmوlDL`z) 5<uO'E8plhjh e(2`)BT8.eaf0T E*x5ȓjS8AG-N34U Ş&0CJk;puDUM)O}>юV6+{}SzrW8Q@BU+J,eY4 l4 tWJHYJ5%n)%4]C''iOv_ݷ$5S-׆a[6H_r"n`@rJ2}Gkh4<턠VY9nH|I $(X1b3etc!Qɀ}bo{Y]wa堜 4kBWmE񵯍rYUEwfݥfuVS)ˆ E|ie17%_G (EPT%Qa3pP]E](ΐmpbۖ YE\fmZB2`[*I 5=-COKIGJeIKd7gpFGͱ2~m7#JHW" )܈P#74[.PI`%z@ (J$-(JtΝiѨk. ˲+kRzˡUL}\鬩j4TC image/svg+xml gpodder-3.5.2/share/man/0000755000175000017500000000000012220346122014424 5ustar thpthp00000000000000gpodder-3.5.2/share/man/man1/0000755000175000017500000000000012220346122015260 5ustar thpthp00000000000000gpodder-3.5.2/share/man/man1/gpo.10000644000175000017500000000463212220345643016143 0ustar thpthp00000000000000.TH GPO "1" "September 2013" "gpodder 3.5.2" "User Commands" .SH NAME gpo \- Text mode interface of gPodder .SH SYNOPSIS .B gpo [\fI--verbose|-v\fR] [\fICOMMAND\fR] [\fIparams...\fR] .SH DESCRIPTION .PP gpo is the text mode interface of gPodder. Run it without any arguments to start the interactive shell (see below). Use "gpo help" to get a list of supported commands. .PP gpo can be used to manage podcasts from the command line without having to start gPodder. It can also be used to automate tasks such as downloading or updating feeds. .PP The database and files are the same as used by \fIgpodder(1)\fR. .SH INTERACTIVE SHELL MODE .PP If you run "gpo" without \fICOMMAND\fR it will enter its interactive shell mode. From there, you can type commands directly. When readline is available, this shell supports completion using . Podcast feed URLs are also completed for commands that take the URL of a podcast as argument. .PP Some commands (e.g. \fIsearch\fR and \fItoplist\fR) will provide a query in interactive shell mode (to subscribe to podcasts). These queries will not be shown when started directly from the command line. .SH COMMAND PREFIXES .PP For all commands, you can use only the first few characters instead of the full command, as long as the command is unique. If not, gpo will show you all matching commands and the shortest prefix of each. .PP Please note that future additions to the command set could change the shortest prefix of any given command, so usage of the full command in scripts is recommended (e.g. use "gpo update" and not "gpo up" in scripts and cronjobs). The short command prefixes are mostly useful for interactive usage. .SH EXAMPLES .PP .B gpo .RS 4 Enter interactive shell mode .RE .PP .B gpo update && gpo download .RS 4 Check for new episodes, then download all new episodes .RE .PP .B gpo search linux outlaws .RS 4 Search the directory for podcasts named "linux outlaws" .RE .PP .B gpo youtube http://youtube.com/watch?v=oHg5SJYRHA0 .RS 4 Print download URL of a YouTube video to stdout .RE .PP .B gpo webui .RS 4 Start a web server serving the gPodder Web UI on localhost .RE .PP .B gpo pipe .RS 4 Start in pipe mode (useful for GUI frontends that want to use the gpodder backend using a JSON-esque request/response protocol) .RE .SH SEE ALSO .PP gpodder(1) .SH BUGS .PP If you find bugs, don't keep them for yourself! .PP Report bugs and feature requests at \fIhttp://bugs.gpodder.org/\fR gpodder-3.5.2/share/man/man1/gpodder.10000644000175000017500000000144712220345612016777 0ustar thpthp00000000000000.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.41.2. .TH GPODDER "1" "September 2013" "gpodder 3.5.2" "User Commands" .SH NAME gpodder \- Media aggregator and podcast client .SH SYNOPSIS .B gpodder [\fIoptions\fR] .SH DESCRIPTION gPodder enables you to subscribe to media feeds (RSS, Atom, YouTube, Soundcloud, Vimeo and XSPF) and automatically download new content. .PP This is the gPodder GUI. See gpo(1) for the command\-line interface. .SH OPTIONS .TP \fB\-\-version\fR show program's version number and exit .TP \fB\-h\fR, \fB\-\-help\fR show this help message and exit .TP \fB\-v\fR, \fB\-\-verbose\fR print logging output on the console .TP \fB\-q\fR, \fB\-\-qml\fR use the QML\-based MeeGo 1.2 Harmattan UI .TP \fB\-s\fR URL, \fB\-\-subscribe\fR=\fIURL\fR subscribe to the feed at URL gpodder-3.5.2/src/0000755000175000017500000000000012220346122013336 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/0000755000175000017500000000000012220346122014762 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/gtkui/0000755000175000017500000000000012220346122016105 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/gtkui/desktop/0000755000175000017500000000000012220346122017556 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/gtkui/desktop/__init__.py0000644000175000017500000000137412220076757021712 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # gpodder-3.5.2/src/gpodder/gtkui/desktop/channel.py0000644000175000017500000002027712220076757021566 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gtk.gdk import gpodder _ = gpodder.gettext from gpodder import util from gpodder.gtkui.interface.common import BuilderWidget class gPodderChannel(BuilderWidget): MAX_SIZE = 120 def new(self): self.gPodderChannel.set_title( self.channel.title) self.entryTitle.set_text( self.channel.title) self.labelURL.set_text(self.channel.url) self.cbSkipFeedUpdate.set_active(self.channel.pause_subscription) self.cbEnableDeviceSync.set_active(self.channel.sync_to_mp3_player) self.section_list = gtk.ListStore(str) active_index = 0 for index, section in enumerate(sorted(self.sections)): self.section_list.append([section]) if section == self.channel.section: active_index = index self.combo_section.set_model(self.section_list) cell_renderer = gtk.CellRendererText() self.combo_section.pack_start(cell_renderer) self.combo_section.add_attribute(cell_renderer, 'text', 0) self.combo_section.set_active(active_index) self.strategy_list = gtk.ListStore(str, int) active_index = 0 for index, (checked, strategy_id, strategy) in \ enumerate(self.channel.get_download_strategies()): self.strategy_list.append([strategy, strategy_id]) if checked: active_index = index self.combo_strategy.set_model(self.strategy_list) cell_renderer = gtk.CellRendererText() self.combo_strategy.pack_start(cell_renderer) self.combo_strategy.add_attribute(cell_renderer, 'text', 0) self.combo_strategy.set_active(active_index) self.LabelDownloadTo.set_text( self.channel.save_dir) self.LabelWebsite.set_text( self.channel.link) if self.channel.auth_username: self.FeedUsername.set_text( self.channel.auth_username) if self.channel.auth_password: self.FeedPassword.set_text( self.channel.auth_password) self.cover_downloader.register('cover-available', self.cover_download_finished) self.cover_downloader.request_cover(self.channel) # Hide the website button if we don't have a valid URL if not self.channel.link: self.btn_website.hide_all() b = gtk.TextBuffer() b.set_text( self.channel.description) self.channel_description.set_buffer( b) #Add Drag and Drop Support flags = gtk.DEST_DEFAULT_ALL targets = [('text/uri-list', 0, 2), ('text/plain', 0, 4)] actions = gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_COPY self.imgCover.drag_dest_set(flags, targets, actions) self.imgCover.connect('drag_data_received', self.drag_data_received) border = 6 self.imgCover.set_size_request(*((self.MAX_SIZE+border*2,)*2)) self.imgCoverEventBox.connect('button-press-event', self.on_cover_popup_menu) def on_button_add_section_clicked(self, widget): text = self.show_text_edit_dialog(_('Add section'), _('New section:'), affirmative_text=gtk.STOCK_ADD) if text is not None: for index, (section,) in enumerate(self.section_list): if text == section: self.combo_section.set_active(index) return self.section_list.append([text]) self.combo_section.set_active(len(self.section_list)-1) def on_cover_popup_menu(self, widget, event): if event.button != 3: return menu = gtk.Menu() item = gtk.ImageMenuItem(gtk.STOCK_OPEN) item.connect('activate', self.on_btnDownloadCover_clicked) menu.append(item) item = gtk.ImageMenuItem(gtk.STOCK_REFRESH) item.connect('activate', self.on_btnClearCover_clicked) menu.append(item) menu.show_all() menu.popup(None, None, None, event.button, event.time, None) def on_btn_website_clicked(self, widget): util.open_website(self.channel.link) def on_btnDownloadCover_clicked(self, widget): dlg = gtk.FileChooserDialog(title=_('Select new podcast cover artwork'), parent=self.gPodderChannel, action=gtk.FILE_CHOOSER_ACTION_OPEN) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_OPEN, gtk.RESPONSE_OK) if dlg.run() == gtk.RESPONSE_OK: url = dlg.get_uri() self.clear_cover_cache(self.channel.url) self.cover_downloader.replace_cover(self.channel, custom_url=url) dlg.destroy() def on_btnClearCover_clicked(self, widget): self.clear_cover_cache(self.channel.url) self.cover_downloader.replace_cover(self.channel, custom_url=False) def cover_download_finished(self, channel, pixbuf): def set_cover(channel, pixbuf): if self.channel == channel: self.imgCover.set_from_pixbuf(self.scale_pixbuf(pixbuf)) self.gPodderChannel.show() util.idle_add(set_cover, channel, pixbuf) def drag_data_received( self, widget, content, x, y, sel, ttype, time): files = sel.data.strip().split('\n') if len(files) != 1: self.show_message( _('You can only drop a single image or URL here.'), _('Drag and drop')) return file = files[0] if file.startswith('file://') or file.startswith('http://'): self.clear_cover_cache(self.channel.url) self.cover_downloader.replace_cover(self.channel, custom_url=file) return self.show_message( _('You can only drop local files and http:// URLs here.'), _('Drag and drop')) def on_gPodderChannel_destroy(self, widget, *args): self.cover_downloader.unregister('cover-available', self.cover_download_finished) def scale_pixbuf(self, pixbuf): # Resize if width is too large if pixbuf.get_width() > self.MAX_SIZE: f = float(self.MAX_SIZE)/pixbuf.get_width() (width, height) = (int(pixbuf.get_width()*f), int(pixbuf.get_height()*f)) pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR) # Resize if height is too large if pixbuf.get_height() > self.MAX_SIZE: f = float(self.MAX_SIZE)/pixbuf.get_height() (width, height) = (int(pixbuf.get_width()*f), int(pixbuf.get_height()*f)) pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR) return pixbuf def on_btnOK_clicked(self, widget, *args): self.channel.pause_subscription = self.cbSkipFeedUpdate.get_active() self.channel.sync_to_mp3_player = self.cbEnableDeviceSync.get_active() self.channel.rename(self.entryTitle.get_text()) self.channel.auth_username = self.FeedUsername.get_text().strip() self.channel.auth_password = self.FeedPassword.get_text() self.clear_cover_cache(self.channel.url) self.cover_downloader.request_cover(self.channel) new_section = self.section_list[self.combo_section.get_active()][0] if self.channel.section != new_section: self.channel.section = new_section section_changed = True else: section_changed = False new_strategy = self.strategy_list[self.combo_strategy.get_active()][1] self.channel.set_download_strategy(new_strategy) self.channel.save() self.gPodderChannel.destroy() self.update_podcast_list_model(selected=True, sections_changed=section_changed) gpodder-3.5.2/src/gpodder/gtkui/desktop/deviceplaylist.py0000644000175000017500000001177012220076757023175 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2011 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os import gpodder _ = gpodder.gettext from gpodder import util import logging logger = logging.getLogger(__name__) class gPodderDevicePlaylist(object): def __init__(self, config, playlist_name): self._config=config self.linebreak = '\r\n' self.playlist_file=util.sanitize_filename(playlist_name + '.m3u') self.playlist_folder = os.path.join(self._config.device_sync.device_folder, self._config.device_sync.playlists.folder) self.mountpoint = util.find_mount_point(util.sanitize_encoding(self.playlist_folder)) if self.mountpoint == '/': self.mountpoint = self.playlist_folder logger.warning('MP3 player resides on / - using %s as MP3 player root', self.mountpoint) self.playlist_absolute_filename=os.path.join(self.playlist_folder, self.playlist_file) def build_extinf(self, filename): #TO DO: Windows playlists # if self._config.mp3_player_playlist_win_path: # filename = filename.replace('\\', os.sep) # # rebuild the whole filename including the mountpoint # if self._config.device_sync.playlist_absolute_path: # absfile = os.path.join(self.mountpoint,filename) # else: #TODO: Test rel filenames # absfile = util.rel2abs(filename, os.path.dirname(self.playlist_file)) # fallback: use the basename of the file (title, extension) = os.path.splitext(os.path.basename(filename)) return "#EXTINF:0,%s%s" % (title.strip(), self.linebreak) def read_m3u(self): """ read all files from the existing playlist """ tracks = [] logger.info("Read data from the playlistfile %s" % self.playlist_absolute_filename) if os.path.exists(self.playlist_absolute_filename): for line in open(self.playlist_absolute_filename, 'r'): if not line.startswith('#EXT'): tracks.append(line.rstrip('\r\n')) return tracks def get_filename_for_playlist(self, episode): """ get the filename for the given episode for the playlist """ filename_base = util.sanitize_filename(episode.sync_filename( self._config.device_sync.custom_sync_name_enabled, self._config.device_sync.custom_sync_name), self._config.device_sync.max_filename_length) filename = filename_base + os.path.splitext(episode.local_filename(create=False))[1].lower() return filename def get_absolute_filename_for_playlist(self, episode): """ get the filename including full path for the given episode for the playlist """ filename = self.get_filename_for_playlist(episode) if self._config.device_sync.one_folder_per_podcast: filename = os.path.join(util.sanitize_filename(episode.channel.title), filename) if self._config.device_sync.playlist.absolute_path: filename = os.path.join(util.relpath(self.mountpoint, self._config.device_sync.device_folder), filename) return filename def write_m3u(self, episodes): """ write the list into the playlist on the device """ logger.info('Writing playlist file: %s', self.playlist_file) if not util.make_directory(self.playlist_folder): raise IOError(_('Folder %s could not be created.') % self.playlist_folder, _('Error writing playlist')) else: fp = open(os.path.join(self.playlist_folder, self.playlist_file), 'w') fp.write('#EXTM3U%s' % self.linebreak) for current_episode in episodes: filename_base = util.sanitize_filename(current_episode.sync_filename( self._config.device_sync.custom_sync_name_enabled, self._config.device_sync.custom_sync_name), self._config.device_sync.max_filename_length) filename = filename_base + os.path.splitext(current_episode.local_filename(create=False))[1].lower() filename = self.get_filename_for_playlist(current_episode) fp.write(self.build_extinf(filename)) filename = self.get_absolute_filename_for_playlist(current_episode) fp.write(filename) fp.write(self.linebreak) fp.close() gpodder-3.5.2/src/gpodder/gtkui/desktop/episodeselector.py0000644000175000017500000004320512220076757023343 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import pango import cgi import gpodder _ = gpodder.gettext N_ = gpodder.ngettext from gpodder import util from gpodder.gtkui.interface.common import BuilderWidget from gpodder.gtkui.interface.common import TreeViewHelper class gPodderEpisodeSelector(BuilderWidget): """Episode selection dialog Optional keyword arguments that modify the behaviour of this dialog: - callback: Function that takes 1 parameter which is a list of the selected episodes (or empty list when none selected) - remove_callback: Function that takes 1 parameter which is a list of episodes that should be "removed" (see below) (default is None, which means remove not possible) - remove_action: Label for the "remove" action (default is "Remove") - remove_finished: Callback after all remove callbacks have finished (default is None, also depends on remove_callback) It will get a list of episode URLs that have been removed, so the main UI can update those - episodes: List of episodes that are presented for selection - selected: (optional) List of boolean variables that define the default checked state for the given episodes - selected_default: (optional) The default boolean value for the checked state if no other value is set (default is False) - columns: List of (name, sort_name, sort_type, caption) pairs for the columns, the name is the attribute name of the episode to be read from each episode object. The sort name is the attribute name of the episode to be used to sort this column. If the sort_name is None it will use the attribute name for sorting. The sort type is the type of the sort column. The caption attribute is the text that appear as column caption (default is [('title_markup', None, None, 'Episode'),]) - title: (optional) The title of the window + heading - instructions: (optional) A one-line text describing what the user should select / what the selection is for - stock_ok_button: (optional) Will replace the "OK" button with another GTK+ stock item to be used for the affirmative button of the dialog (e.g. can be gtk.STOCK_DELETE when the episodes to be selected will be deleted after closing the dialog) - selection_buttons: (optional) A dictionary with labels as keys and callbacks as values; for each key a button will be generated, and when the button is clicked, the callback will be called for each episode and the return value of the callback (True or False) will be the new selected state of the episode - size_attribute: (optional) The name of an attribute of the supplied episode objects that can be used to calculate the size of an episode; set this to None if no total size calculation should be done (in cases where total size is useless) (default is 'file_size') - tooltip_attribute: (optional) The name of an attribute of the supplied episode objects that holds the text for the tooltips when hovering over an episode (default is 'description') """ COLUMN_INDEX = 0 COLUMN_TOOLTIP = 1 COLUMN_TOGGLE = 2 COLUMN_ADDITIONAL = 3 def new( self): self._config.connect_gtk_window(self.gPodderEpisodeSelector, 'episode_selector', True) if not hasattr( self, 'callback'): self.callback = None if not hasattr(self, 'remove_callback'): self.remove_callback = None if not hasattr(self, 'remove_action'): self.remove_action = _('Remove') if not hasattr(self, 'remove_finished'): self.remove_finished = None if not hasattr( self, 'episodes'): self.episodes = [] if not hasattr( self, 'size_attribute'): self.size_attribute = 'file_size' if not hasattr(self, 'tooltip_attribute'): self.tooltip_attribute = 'description' if not hasattr( self, 'selection_buttons'): self.selection_buttons = {} if not hasattr( self, 'selected_default'): self.selected_default = False if not hasattr( self, 'selected'): self.selected = [self.selected_default]*len(self.episodes) if len(self.selected) < len(self.episodes): self.selected += [self.selected_default]*(len(self.episodes)-len(self.selected)) if not hasattr( self, 'columns'): self.columns = (('title_markup', None, None, _('Episode')),) if hasattr(self, 'title'): self.gPodderEpisodeSelector.set_title(self.title) if hasattr( self, 'instructions'): self.labelInstructions.set_text( self.instructions) self.labelInstructions.show_all() if hasattr(self, 'stock_ok_button'): if self.stock_ok_button == 'gpodder-download': self.btnOK.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_BUTTON)) self.btnOK.set_label(_('Download')) else: self.btnOK.set_label(self.stock_ok_button) self.btnOK.set_use_stock(True) # check/uncheck column toggle_cell = gtk.CellRendererToggle() toggle_cell.connect( 'toggled', self.toggle_cell_handler) toggle_column = gtk.TreeViewColumn('', toggle_cell, active=self.COLUMN_TOGGLE) toggle_column.set_clickable(True) self.treeviewEpisodes.append_column(toggle_column) next_column = self.COLUMN_ADDITIONAL for name, sort_name, sort_type, caption in self.columns: renderer = gtk.CellRendererText() if next_column < self.COLUMN_ADDITIONAL + 1: renderer.set_property('ellipsize', pango.ELLIPSIZE_END) column = gtk.TreeViewColumn(caption, renderer, markup=next_column) column.set_clickable(False) column.set_resizable( True) # Only set "expand" on the first column if next_column < self.COLUMN_ADDITIONAL + 1: column.set_expand(True) if sort_name is not None: column.set_sort_column_id(next_column+1) else: column.set_sort_column_id(next_column) self.treeviewEpisodes.append_column( column) next_column += 1 if sort_name is not None: # add the sort column column = gtk.TreeViewColumn() column.set_clickable(False) column.set_visible(False) self.treeviewEpisodes.append_column( column) next_column += 1 column_types = [ int, str, bool ] # add string column type plus sort column type if it exists for name, sort_name, sort_type, caption in self.columns: column_types.append(str) if sort_name is not None: column_types.append(sort_type) self.model = gtk.ListStore( *column_types) tooltip = None for index, episode in enumerate( self.episodes): if self.tooltip_attribute is not None: try: tooltip = getattr(episode, self.tooltip_attribute) except: tooltip = None row = [ index, tooltip, self.selected[index] ] for name, sort_name, sort_type, caption in self.columns: if not hasattr(episode, name): row.append(None) else: row.append(getattr( episode, name)) if sort_name is not None: if not hasattr(episode, sort_name): row.append(None) else: row.append(getattr( episode, sort_name)) self.model.append( row) if self.remove_callback is not None: self.btnRemoveAction.show() self.btnRemoveAction.set_label(self.remove_action) # connect to tooltip signals if self.tooltip_attribute is not None: try: self.treeviewEpisodes.set_property('has-tooltip', True) self.treeviewEpisodes.connect('query-tooltip', self.treeview_episodes_query_tooltip) except: pass self.last_tooltip_episode = None self.episode_list_can_tooltip = True self.treeviewEpisodes.connect('button-press-event', self.treeview_episodes_button_pressed) self.treeviewEpisodes.connect('popup-menu', self.treeview_episodes_button_pressed) self.treeviewEpisodes.set_rules_hint( True) self.treeviewEpisodes.set_model( self.model) self.treeviewEpisodes.columns_autosize() # Focus the toggle column for Tab-focusing (bug 503) path, column = self.treeviewEpisodes.get_cursor() if path is not None: self.treeviewEpisodes.set_cursor(path, toggle_column) self.calculate_total_size() def treeview_episodes_query_tooltip(self, treeview, x, y, keyboard_tooltip, tooltip): # With get_bin_window, we get the window that contains the rows without # the header. The Y coordinate of this window will be the height of the # treeview header. This is the amount we have to subtract from the # event's Y coordinate to get the coordinate to pass to get_path_at_pos (x_bin, y_bin) = treeview.get_bin_window().get_position() y -= x_bin y -= y_bin (path, column, rx, ry) = treeview.get_path_at_pos(x, y) or (None,)*4 if not self.episode_list_can_tooltip or column != treeview.get_columns()[1]: self.last_tooltip_episode = None return False if path is not None: model = treeview.get_model() iter = model.get_iter(path) index = model.get_value(iter, self.COLUMN_INDEX) description = model.get_value(iter, self.COLUMN_TOOLTIP) if self.last_tooltip_episode is not None and self.last_tooltip_episode != index: self.last_tooltip_episode = None return False self.last_tooltip_episode = index description = util.remove_html_tags(description) # Bug 1825: make sure description is a unicode string, # so it may be cut correctly on UTF-8 char boundaries description = util.convert_bytes(description) if description is not None: if len(description) > 400: description = description[:398]+'[...]' tooltip.set_text(description) return True else: return False self.last_tooltip_episode = None return False def treeview_episodes_button_pressed(self, treeview, event=None): if event is None or event.button == 3: menu = gtk.Menu() if len(self.selection_buttons): for label in self.selection_buttons: item = gtk.MenuItem(label) item.connect('activate', self.custom_selection_button_clicked, label) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('Select all')) item.connect('activate', self.on_btnCheckAll_clicked) menu.append(item) item = gtk.MenuItem(_('Select none')) item.connect('activate', self.on_btnCheckNone_clicked) menu.append(item) menu.show_all() # Disable tooltips while we are showing the menu, so # the tooltip will not appear over the menu self.episode_list_can_tooltip = False menu.connect('deactivate', lambda menushell: self.episode_list_allow_tooltips()) if event is None: func = TreeViewHelper.make_popup_position_func(treeview) menu.popup(None, None, func, 3, 0) else: menu.popup(None, None, None, event.button, event.time) return True def episode_list_allow_tooltips(self): self.episode_list_can_tooltip = True def calculate_total_size( self): if self.size_attribute is not None: (total_size, count) = (0, 0) for episode in self.get_selected_episodes(): try: total_size += int(getattr( episode, self.size_attribute)) count += 1 except: pass text = [] if count == 0: text.append(_('Nothing selected')) text.append(N_('%(count)d episode', '%(count)d episodes', count) % {'count':count}) if total_size > 0: text.append(_('size: %s') % util.format_filesize(total_size)) self.labelTotalSize.set_text(', '.join(text)) self.btnOK.set_sensitive(count>0) self.btnRemoveAction.set_sensitive(count>0) if count > 0: self.btnCancel.set_label(gtk.STOCK_CANCEL) else: self.btnCancel.set_label(gtk.STOCK_CLOSE) else: self.btnOK.set_sensitive(False) self.btnRemoveAction.set_sensitive(False) for index, row in enumerate(self.model): if self.model.get_value(row.iter, self.COLUMN_TOGGLE) == True: self.btnOK.set_sensitive(True) self.btnRemoveAction.set_sensitive(True) break self.labelTotalSize.set_text('') def toggle_cell_handler( self, cell, path): model = self.treeviewEpisodes.get_model() model[path][self.COLUMN_TOGGLE] = not model[path][self.COLUMN_TOGGLE] self.calculate_total_size() def custom_selection_button_clicked(self, button, label): callback = self.selection_buttons[label] for index, row in enumerate( self.model): new_value = callback( self.episodes[index]) self.model.set_value( row.iter, self.COLUMN_TOGGLE, new_value) self.calculate_total_size() def on_btnCheckAll_clicked( self, widget): for row in self.model: self.model.set_value( row.iter, self.COLUMN_TOGGLE, True) self.calculate_total_size() def on_btnCheckNone_clicked( self, widget): for row in self.model: self.model.set_value( row.iter, self.COLUMN_TOGGLE, False) self.calculate_total_size() def on_remove_action_activate(self, widget): episodes = self.get_selected_episodes(remove_episodes=True) urls = [] for episode in episodes: urls.append(episode.url) self.remove_callback(episode) if self.remove_finished is not None: self.remove_finished(urls) self.calculate_total_size() # Close the window when there are no episodes left model = self.treeviewEpisodes.get_model() if model.get_iter_first() is None: self.on_btnCancel_clicked(None) def on_row_activated(self, treeview, path, view_column): model = treeview.get_model() iter = model.get_iter(path) value = model.get_value(iter, self.COLUMN_TOGGLE) model.set_value(iter, self.COLUMN_TOGGLE, not value) self.calculate_total_size() def get_selected_episodes( self, remove_episodes=False): selected_episodes = [] for index, row in enumerate( self.model): if self.model.get_value( row.iter, self.COLUMN_TOGGLE) == True: selected_episodes.append( self.episodes[self.model.get_value( row.iter, self.COLUMN_INDEX)]) if remove_episodes: for episode in selected_episodes: index = self.episodes.index(episode) iter = self.model.get_iter_first() while iter is not None: if self.model.get_value(iter, self.COLUMN_INDEX) == index: self.model.remove(iter) break iter = self.model.iter_next(iter) return selected_episodes def on_btnOK_clicked( self, widget): self.gPodderEpisodeSelector.destroy() if self.callback is not None: self.callback( self.get_selected_episodes()) def on_btnCancel_clicked( self, widget): self.gPodderEpisodeSelector.destroy() if self.callback is not None: self.callback([]) gpodder-3.5.2/src/gpodder/gtkui/desktop/podcastdirectory.py0000644000175000017500000001633112220076757023534 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import pango import urllib import os.path import gpodder _ = gpodder.gettext from gpodder import util from gpodder import opml from gpodder import youtube from gpodder import my from gpodder.gtkui.opml import OpmlListModel from gpodder.gtkui.interface.common import BuilderWidget class gPodderPodcastDirectory(BuilderWidget): def new(self): if hasattr(self, 'custom_title'): self.gPodderPodcastDirectory.set_title(self.custom_title) if hasattr(self, 'hide_url_entry'): self.hboxOpmlUrlEntry.hide_all() new_parent = self.notebookChannelAdder.get_parent() new_parent.remove(self.notebookChannelAdder) self.vboxOpmlImport.reparent(new_parent) if not hasattr(self, 'add_podcast_list'): self.add_podcast_list = None self.setup_treeview(self.treeviewChannelChooser) self.setup_treeview(self.treeviewTopPodcastsChooser) self.setup_treeview(self.treeviewYouTubeChooser) self.notebookChannelAdder.connect('switch-page', lambda a, b, c: self.on_change_tab(c)) def on_entryURL_changed(self, entry): url = entry.get_text() if self.is_search_term(url): self.btnDownloadOpml.set_label(_('Search')) else: self.btnDownloadOpml.set_label(_('Download')) def setup_treeview(self, tv): togglecell = gtk.CellRendererToggle() togglecell.set_property( 'activatable', True) togglecell.connect( 'toggled', self.callback_edited) togglecolumn = gtk.TreeViewColumn( '', togglecell, active=OpmlListModel.C_SELECTED) togglecolumn.set_min_width(40) titlecell = gtk.CellRendererText() titlecell.set_property('ellipsize', pango.ELLIPSIZE_END) titlecolumn = gtk.TreeViewColumn(_('Podcast'), titlecell, markup=OpmlListModel.C_DESCRIPTION_MARKUP) for itemcolumn in (togglecolumn, titlecolumn): tv.append_column(itemcolumn) def callback_edited( self, cell, path): model = self.get_treeview().get_model() model[path][OpmlListModel.C_SELECTED] = not model[path][OpmlListModel.C_SELECTED] self.btnOK.set_sensitive(bool(len(self.get_selected_channels()))) def get_selected_channels(self, tab=None): channels = [] model = self.get_treeview(tab).get_model() if model is not None: for row in model: if row[OpmlListModel.C_SELECTED]: channels.append((row[OpmlListModel.C_TITLE], row[OpmlListModel.C_URL])) return channels def on_change_tab(self, tab): self.btnOK.set_sensitive( bool(len(self.get_selected_channels(tab)))) def thread_finished(self, model, tab=0): if tab == 1: tv = self.treeviewTopPodcastsChooser elif tab == 2: tv = self.treeviewYouTubeChooser self.entryYoutubeSearch.set_sensitive(True) self.btnSearchYouTube.set_sensitive(True) self.btnOK.set_sensitive(False) else: tv = self.treeviewChannelChooser self.btnDownloadOpml.set_sensitive(True) self.entryURL.set_sensitive(True) tv.set_model(model) tv.set_sensitive(True) def is_search_term(self, url): return ('://' not in url and not os.path.exists(url)) def thread_func(self, tab=0): if tab == 1: model = OpmlListModel(opml.Importer(my.TOPLIST_OPML)) if len(model) == 0: self.notification(_('The specified URL does not provide any valid OPML podcast items.'), _('No feeds found')) elif tab == 2: model = OpmlListModel(youtube.find_youtube_channels(self.entryYoutubeSearch.get_text())) if len(model) == 0: self.notification(_('There are no YouTube channels that would match this query.'), _('No channels found')) else: url = self.entryURL.get_text() if self.is_search_term(url): url = 'http://gpodder.net/search.opml?q=' + urllib.quote(url) model = OpmlListModel(opml.Importer(url)) if len(model) == 0: self.notification(_('The specified URL does not provide any valid OPML podcast items.'), _('No feeds found')) util.idle_add(self.thread_finished, model, tab) def download_opml_file(self, url): self.entryURL.set_text(url) self.btnDownloadOpml.set_sensitive(False) self.entryURL.set_sensitive(False) self.btnOK.set_sensitive(False) self.treeviewChannelChooser.set_sensitive(False) util.run_in_background(self.thread_func) util.run_in_background(lambda: self.thread_func(1)) def select_all( self, value ): enabled = False model = self.get_treeview().get_model() if model is not None: for row in model: row[OpmlListModel.C_SELECTED] = value if value: enabled = True self.btnOK.set_sensitive(enabled) def on_gPodderPodcastDirectory_destroy(self, widget, *args): pass def on_btnDownloadOpml_clicked(self, widget, *args): self.download_opml_file(self.entryURL.get_text()) def on_btnSearchYouTube_clicked(self, widget, *args): self.entryYoutubeSearch.set_sensitive(False) self.treeviewYouTubeChooser.set_sensitive(False) self.btnSearchYouTube.set_sensitive(False) util.run_in_background(lambda: self.thread_func(2)) def on_btnSelectAll_clicked(self, widget, *args): self.select_all(True) def on_btnSelectNone_clicked(self, widget, *args): self.select_all(False) def on_btnOK_clicked(self, widget, *args): channels = self.get_selected_channels() self.gPodderPodcastDirectory.destroy() # add channels that have been selected if self.add_podcast_list is not None: self.add_podcast_list(channels) def on_btnCancel_clicked(self, widget, *args): self.gPodderPodcastDirectory.destroy() def on_entryYoutubeSearch_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Return: self.on_btnSearchYouTube_clicked(widget) def get_treeview(self, tab=None): if tab is None: tab = self.notebookChannelAdder.get_current_page() if tab == 0: return self.treeviewChannelChooser elif tab == 1: return self.treeviewTopPodcastsChooser else: return self.treeviewYouTubeChooser gpodder-3.5.2/src/gpodder/gtkui/desktop/preferences.py0000644000175000017500000006701112220076757022454 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import pango import cgi import urlparse import logging logger = logging.getLogger(__name__) import gpodder _ = gpodder.gettext N_ = gpodder.ngettext from gpodder import util from gpodder import youtube from gpodder.gtkui.interface.common import BuilderWidget from gpodder.gtkui.interface.common import TreeViewHelper from gpodder.gtkui.interface.configeditor import gPodderConfigEditor from gpodder.gtkui.desktopfile import PlayerListModel class NewEpisodeActionList(gtk.ListStore): C_CAPTION, C_AUTO_DOWNLOAD = range(2) ACTION_NONE, ACTION_ASK, ACTION_MINIMIZED, ACTION_ALWAYS = range(4) def __init__(self, config): gtk.ListStore.__init__(self, str, str) self._config = config self.append((_('Do nothing'), 'ignore')) self.append((_('Show episode list'), 'show')) self.append((_('Add to download list'), 'queue')) self.append((_('Download immediately'), 'download')) def get_index(self): for index, row in enumerate(self): if self._config.auto_download == row[self.C_AUTO_DOWNLOAD]: return index return 1 # Some sane default def set_index(self, index): self._config.auto_download = self[index][self.C_AUTO_DOWNLOAD] class DeviceTypeActionList(gtk.ListStore): C_CAPTION, C_DEVICE_TYPE = range(2) def __init__(self, config): gtk.ListStore.__init__(self, str, str) self._config = config self.append((_('None'), 'none')) self.append((_('Filesystem-based'), 'filesystem')) def get_index(self): for index, row in enumerate(self): if self._config.device_sync.device_type == row[self.C_DEVICE_TYPE]: return index return 0 # Some sane default def set_index(self, index): self._config.device_sync.device_type = self[index][self.C_DEVICE_TYPE] class OnSyncActionList(gtk.ListStore): C_CAPTION, C_ON_SYNC_DELETE, C_ON_SYNC_MARK_PLAYED = range(3) ACTION_NONE, ACTION_ASK, ACTION_MINIMIZED, ACTION_ALWAYS = range(4) def __init__(self, config): gtk.ListStore.__init__(self, str, bool, bool) self._config = config self.append((_('Do nothing'), False, False)) self.append((_('Mark as played'), False, True)) self.append((_('Delete from gPodder'), True, False)) def get_index(self): for index, row in enumerate(self): if (self._config.device_sync.after_sync.delete_episodes and row[self.C_ON_SYNC_DELETE]): return index if (self._config.device_sync.after_sync.mark_episodes_played and row[self.C_ON_SYNC_MARK_PLAYED] and not self._config.device_sync.after_sync.delete_episodes): return index return 0 # Some sane default def set_index(self, index): self._config.device_sync.after_sync.delete_episodes = self[index][self.C_ON_SYNC_DELETE] self._config.device_sync.after_sync.mark_episodes_played = self[index][self.C_ON_SYNC_MARK_PLAYED] class gPodderFlattrSignIn(BuilderWidget): def new(self): import webkit self.web = webkit.WebView() self.web.connect('resource-request-starting', self.on_web_request) self.main_window.connect('destroy', self.set_flattr_preferences) auth_url = self.flattr.get_auth_url() logger.info(auth_url) self.web.open(auth_url) self.scrolledwindow_web.add(self.web) self.web.show() def on_web_request(self, web_view, web_frame, web_resource, request, response): uri = request.get_uri() if uri.startswith(self.flattr.CALLBACK): if not self.flattr.process_retrieved_code(uri): self.show_message(query['error_description'][0], _('Error'), important=True) # Destroy the window later util.idle_add(self.main_window.destroy) def on_btn_close_clicked(self, widget): util.idle_add(self.main_window.destroy) class VideoFormatList(gtk.ListStore): C_CAPTION, C_ID = range(2) def __init__(self, config): gtk.ListStore.__init__(self, str, int) self._config = config if self._config.youtube.preferred_fmt_ids: caption = _('Custom (%(format_ids)s)') % { 'format_ids': ', '.join(self.custom_format_ids), } self.append((caption, -1)) else: for id, (fmt_id, path, description) in youtube.formats: self.append((description, id)) def get_index(self): for index, row in enumerate(self): if self._config.youtube.preferred_fmt_id == row[self.C_ID]: return index return 0 def set_index(self, index): value = self[index][self.C_ID] if value > 0: self._config.youtube.preferred_fmt_id = value class gPodderPreferences(BuilderWidget): C_TOGGLE, C_LABEL, C_EXTENSION, C_SHOW_TOGGLE = range(4) def new(self): for cb in (self.combo_audio_player_app, self.combo_video_player_app): cellrenderer = gtk.CellRendererPixbuf() cb.pack_start(cellrenderer, False) cb.add_attribute(cellrenderer, 'pixbuf', PlayerListModel.C_ICON) cellrenderer = gtk.CellRendererText() cellrenderer.set_property('ellipsize', pango.ELLIPSIZE_END) cb.pack_start(cellrenderer, True) cb.add_attribute(cellrenderer, 'markup', PlayerListModel.C_NAME) cb.set_row_separator_func(PlayerListModel.is_separator) self.audio_player_model = self.user_apps_reader.get_model('audio') self.combo_audio_player_app.set_model(self.audio_player_model) index = self.audio_player_model.get_index(self._config.player) self.combo_audio_player_app.set_active(index) self.video_player_model = self.user_apps_reader.get_model('video') self.combo_video_player_app.set_model(self.video_player_model) index = self.video_player_model.get_index(self._config.videoplayer) self.combo_video_player_app.set_active(index) self.preferred_video_format_model = VideoFormatList(self._config) self.combobox_preferred_video_format.set_model(self.preferred_video_format_model) cellrenderer = gtk.CellRendererText() self.combobox_preferred_video_format.pack_start(cellrenderer, True) self.combobox_preferred_video_format.add_attribute(cellrenderer, 'text', self.preferred_video_format_model.C_CAPTION) self.combobox_preferred_video_format.set_active(self.preferred_video_format_model.get_index()) self.update_interval_presets = [0, 10, 30, 60, 2*60, 6*60, 12*60] adjustment_update_interval = self.hscale_update_interval.get_adjustment() adjustment_update_interval.upper = len(self.update_interval_presets)-1 if self._config.auto_update_frequency in self.update_interval_presets: index = self.update_interval_presets.index(self._config.auto_update_frequency) self.hscale_update_interval.set_value(index) else: # Patch in the current "custom" value into the mix self.update_interval_presets.append(self._config.auto_update_frequency) self.update_interval_presets.sort() adjustment_update_interval.upper = len(self.update_interval_presets)-1 index = self.update_interval_presets.index(self._config.auto_update_frequency) self.hscale_update_interval.set_value(index) self._config.connect_gtk_spinbutton('max_episodes_per_feed', self.spinbutton_episode_limit) self.auto_download_model = NewEpisodeActionList(self._config) self.combo_auto_download.set_model(self.auto_download_model) cellrenderer = gtk.CellRendererText() self.combo_auto_download.pack_start(cellrenderer, True) self.combo_auto_download.add_attribute(cellrenderer, 'text', NewEpisodeActionList.C_CAPTION) self.combo_auto_download.set_active(self.auto_download_model.get_index()) if self._config.auto_remove_played_episodes: adjustment_expiration = self.hscale_expiration.get_adjustment() if self._config.episode_old_age > adjustment_expiration.get_upper(): # Patch the adjustment to include the higher current value adjustment_expiration.upper = self._config.episode_old_age self.hscale_expiration.set_value(self._config.episode_old_age) else: self.hscale_expiration.set_value(0) self._config.connect_gtk_togglebutton('auto_remove_unplayed_episodes', self.checkbutton_expiration_unplayed) self._config.connect_gtk_togglebutton('auto_remove_unfinished_episodes', self.checkbutton_expiration_unfinished) self.device_type_model = DeviceTypeActionList(self._config) self.combobox_device_type.set_model(self.device_type_model) cellrenderer = gtk.CellRendererText() self.combobox_device_type.pack_start(cellrenderer, True) self.combobox_device_type.add_attribute(cellrenderer, 'text', DeviceTypeActionList.C_CAPTION) self.combobox_device_type.set_active(self.device_type_model.get_index()) self.on_sync_model = OnSyncActionList(self._config) self.combobox_on_sync.set_model(self.on_sync_model) cellrenderer = gtk.CellRendererText() self.combobox_on_sync.pack_start(cellrenderer, True) self.combobox_on_sync.add_attribute(cellrenderer, 'text', OnSyncActionList.C_CAPTION) self.combobox_on_sync.set_active(self.on_sync_model.get_index()) self._config.connect_gtk_togglebutton('device_sync.skip_played_episodes', self.checkbutton_skip_played_episodes) self._config.connect_gtk_togglebutton('device_sync.playlists.create', self.checkbutton_create_playlists) self._config.connect_gtk_togglebutton('device_sync.playlists.two_way_sync', self.checkbutton_delete_using_playlists) # Have to do this before calling set_active on checkbutton_enable self._enable_mygpo = self._config.mygpo.enabled # Initialize the UI state with configuration settings self.checkbutton_enable.set_active(self._config.mygpo.enabled) self.entry_username.set_text(self._config.mygpo.username) self.entry_password.set_text(self._config.mygpo.password) self.entry_caption.set_text(self._config.mygpo.device.caption) # Disable mygpo sync while the dialog is open self._config.mygpo.enabled = False # Initialize Flattr settings self.set_flattr_preferences() # Configure the extensions manager GUI self.set_extension_preferences() def set_extension_preferences(self): def search_equal_func(model, column, key, it): label = model.get_value(it, self.C_LABEL) if key.lower() in label.lower(): # from http://www.pygtk.org/docs/pygtk/class-gtktreeview.html: # "func should return False to indicate that the row matches # the search criteria." return False return True self.treeviewExtensions.set_search_equal_func(search_equal_func) toggle_cell = gtk.CellRendererToggle() toggle_cell.connect('toggled', self.on_extensions_cell_toggled) toggle_column = gtk.TreeViewColumn('') toggle_column.pack_start(toggle_cell, True) toggle_column.add_attribute(toggle_cell, 'active', self.C_TOGGLE) toggle_column.add_attribute(toggle_cell, 'visible', self.C_SHOW_TOGGLE) toggle_column.set_property('min-width', 32) self.treeviewExtensions.append_column(toggle_column) name_cell = gtk.CellRendererText() name_cell.set_property('ellipsize', pango.ELLIPSIZE_END) extension_column = gtk.TreeViewColumn(_('Name')) extension_column.pack_start(name_cell, True) extension_column.add_attribute(name_cell, 'markup', self.C_LABEL) extension_column.set_expand(True) self.treeviewExtensions.append_column(extension_column) self.extensions_model = gtk.ListStore(bool, str, object, bool) def key_func(pair): category, container = pair return (category, container.metadata.title) def convert(extensions): for container in extensions: yield (container.metadata.category, container) old_category = None for category, container in sorted(convert(gpodder.user_extensions.get_extensions()), key=key_func): if old_category != category: label = '%s' % cgi.escape(category) self.extensions_model.append((None, label, None, False)) old_category = category label = '%s\n%s' % ( cgi.escape(container.metadata.title), cgi.escape(container.metadata.description)) self.extensions_model.append((container.enabled, label, container, True)) self.treeviewExtensions.set_model(self.extensions_model) self.treeviewExtensions.columns_autosize() def on_treeview_extension_button_released(self, treeview, event): if event.window != treeview.get_bin_window(): return False if event.type == gtk.gdk.BUTTON_RELEASE and event.button == 3: return self.on_treeview_extension_show_context_menu(treeview, event) return False def on_treeview_extension_show_context_menu(self, treeview, event=None): selection = treeview.get_selection() model, paths = selection.get_selected_rows() container = model.get_value(model.get_iter(paths[0]), self.C_EXTENSION) if not container: return menu = gtk.Menu() if container.metadata.doc: menu_item = gtk.MenuItem(_('Documentation')) menu_item.connect('activate', self.open_weblink, container.metadata.doc) menu.append(menu_item) menu_item = gtk.MenuItem(_('Extension info')) menu_item.connect('activate', self.show_extension_info, model, container) menu.append(menu_item) if container.metadata.payment: if self.flattr.is_flattrable(container.metadata.payment): menu_item = gtk.MenuItem(_('Flattr this')) menu_item.connect('activate', self.flattr_extension, container.metadata.payment) else: menu_item = gtk.MenuItem(_('Support the author')) menu_item.connect('activate', self.open_weblink, container.metadata.payment) menu.append(menu_item) menu.show_all() if event is None: func = TreeViewHelper.make_popup_position_func(treeview) menu.popup(None, None, func, 3, 0) else: menu.popup(None, None, None, 3, 0) return True def set_flattr_preferences(self, widget=None): if not self._config.flattr.token: self.label_flattr.set_text(_('Please sign in with Flattr and Support Publishers')) self.button_flattr_login.set_label(_('Sign in to Flattr')) else: flattr_user = self.flattr.get_auth_username() self.label_flattr.set_markup(_('Logged in as %(username)s') % {'username': flattr_user}) self.button_flattr_login.set_label(_('Sign out')) self.checkbutton_flattr_on_play.set_active(self._config.flattr.flattr_on_play) def on_button_flattr_login(self, widget): if not self._config.flattr.token: try: import webkit except ImportError, ie: self.show_message(_('Flattr integration requires WebKit/Gtk.'), _('WebKit/Gtk not found'), important=True) return gPodderFlattrSignIn(self.parent_window, _config=self._config, flattr=self.flattr, set_flattr_preferences=self.set_flattr_preferences) else: self._config.flattr.token = '' self.set_flattr_preferences() def on_check_flattr_on_play(self, widget): self._config.flattr.flattr_on_play = widget.get_active() def on_extensions_cell_toggled(self, cell, path): model = self.treeviewExtensions.get_model() it = model.get_iter(path) container = model.get_value(it, self.C_EXTENSION) enabled_extensions = list(self._config.extensions.enabled) new_enabled = not model.get_value(it, self.C_TOGGLE) if new_enabled and container.name not in enabled_extensions: enabled_extensions.append(container.name) elif not new_enabled and container.name in enabled_extensions: enabled_extensions.remove(container.name) self._config.extensions.enabled = enabled_extensions now_enabled = (container.name in self._config.extensions.enabled) if new_enabled == now_enabled: model.set_value(it, self.C_TOGGLE, new_enabled) elif container.error is not None: self.show_message(container.error.message, _('Extension cannot be activated'), important=True) model.set_value(it, self.C_TOGGLE, False) def show_extension_info(self, w, model, container): if not container or not model: return # This is one ugly hack, but it displays the attributes of # the metadata object of the container.. info = '\n'.join('%s: %s' % tuple(map(cgi.escape, map(str, (key, value)))) for key, value in container.metadata.get_sorted()) self.show_message(info, _('Extension module info'), important=True) def open_weblink(self, w, url): util.open_website(url) def flattr_extension(self, w, flattr_url): success, message = self.flattr.flattr_url(flattr_url) self.show_message(message, title=_('Flattr status'), important=not success) def on_dialog_destroy(self, widget): # Re-enable mygpo sync if the user has selected it self._config.mygpo.enabled = self._enable_mygpo # Make sure the device is successfully created/updated self.mygpo_client.create_device() # Flush settings for mygpo client now self.mygpo_client.flush(now=True) def on_button_close_clicked(self, widget): self.main_window.destroy() def on_button_advanced_clicked(self, widget): self.main_window.destroy() gPodderConfigEditor(self.parent_window, _config=self._config) def on_combo_audio_player_app_changed(self, widget): index = self.combo_audio_player_app.get_active() self._config.player = self.audio_player_model.get_command(index) def on_combo_video_player_app_changed(self, widget): index = self.combo_video_player_app.get_active() self._config.videoplayer = self.video_player_model.get_command(index) def on_combobox_preferred_video_format_changed(self, widget): index = self.combobox_preferred_video_format.get_active() self.preferred_video_format_model.set_index(index) def on_button_audio_player_clicked(self, widget): result = self.show_text_edit_dialog(_('Configure audio player'), \ _('Command:'), \ self._config.player) if result: self._config.player = result index = self.audio_player_model.get_index(self._config.player) self.combo_audio_player_app.set_active(index) def on_button_video_player_clicked(self, widget): result = self.show_text_edit_dialog(_('Configure video player'), \ _('Command:'), \ self._config.videoplayer) if result: self._config.videoplayer = result index = self.video_player_model.get_index(self._config.videoplayer) self.combo_video_player_app.set_active(index) def format_update_interval_value(self, scale, value): value = int(value) if value == 0: return _('manually') elif value > 0 and len(self.update_interval_presets) > value: return util.format_seconds_to_hour_min_sec(self.update_interval_presets[value]*60) else: return str(value) def on_update_interval_value_changed(self, range): value = int(range.get_value()) self._config.auto_update_feeds = (value > 0) self._config.auto_update_frequency = self.update_interval_presets[value] def on_combo_auto_download_changed(self, widget): index = self.combo_auto_download.get_active() self.auto_download_model.set_index(index) def format_expiration_value(self, scale, value): value = int(value) if value == 0: return _('manually') else: return N_('after %(count)d day', 'after %(count)d days', value) % {'count':value} def on_expiration_value_changed(self, range): value = int(range.get_value()) if value == 0: self.checkbutton_expiration_unplayed.set_active(False) self._config.auto_remove_played_episodes = False self._config.auto_remove_unplayed_episodes = False else: self._config.auto_remove_played_episodes = True self._config.episode_old_age = value self.checkbutton_expiration_unplayed.set_sensitive(value > 0) self.checkbutton_expiration_unfinished.set_sensitive(value > 0) def on_enabled_toggled(self, widget): # Only update indirectly (see on_dialog_destroy) self._enable_mygpo = widget.get_active() def on_username_changed(self, widget): self._config.mygpo.username = widget.get_text() def on_password_changed(self, widget): self._config.mygpo.password = widget.get_text() def on_device_caption_changed(self, widget): self._config.mygpo.device.caption = widget.get_text() def on_button_overwrite_clicked(self, button): title = _('Replace subscription list on server') message = _('Remote podcasts that have not been added locally will be removed on the server. Continue?') if self.show_confirmation(message, title): @util.run_in_background def thread_proc(): self._config.mygpo.enabled = True self.on_send_full_subscriptions() self._config.mygpo.enabled = False def on_combobox_on_sync_changed(self, widget): index = self.combobox_on_sync.get_active() self.on_sync_model.set_index(index) def on_checkbutton_create_playlists_toggled(self, widget,device_type_changed=False): if not widget.get_active(): self._config.device_sync.playlists.create=False self.toggle_playlist_interface(False) #need to read value of checkbutton from interface, #rather than value of parameter else: self._config.device_sync.playlists.create=True self.toggle_playlist_interface(True) def toggle_playlist_interface(self, enabled): if enabled and self._config.device_sync.device_type != 'none': self.btn_playlistfolder.set_sensitive(True) self.btn_playlistfolder.set_label(self._config.device_sync.playlists.folder) self.checkbutton_delete_using_playlists.set_sensitive(True) children = self.btn_playlistfolder.get_children() if children: label = children.pop() label.set_alignment(0., .5) else: self.btn_playlistfolder.set_sensitive(False) self.btn_playlistfolder.set_label('') self.checkbutton_delete_using_playlists.set_sensitive(False) def on_combobox_device_type_changed(self, widget): index = self.combobox_device_type.get_active() self.device_type_model.set_index(index) device_type = self._config.device_sync.device_type if device_type == 'none': self.btn_filesystemMountpoint.set_label('') self.btn_filesystemMountpoint.set_sensitive(False) self.checkbutton_create_playlists.set_sensitive(False) self.toggle_playlist_interface(False) self.checkbutton_delete_using_playlists.set_sensitive(False) self.combobox_on_sync.set_sensitive(False) self.checkbutton_skip_played_episodes.set_sensitive(False) elif device_type == 'filesystem': self.btn_filesystemMountpoint.set_label(self._config.device_sync.device_folder) self.btn_filesystemMountpoint.set_sensitive(True) self.checkbutton_create_playlists.set_sensitive(True) children = self.btn_filesystemMountpoint.get_children() if children: label = children.pop() label.set_alignment(0., .5) self.toggle_playlist_interface(self._config.device_sync.playlists.create) self.combobox_on_sync.set_sensitive(True) self.checkbutton_skip_played_episodes.set_sensitive(True) else: # TODO: Add support for iPod and MTP devices pass def on_btn_device_mountpoint_clicked(self, widget): fs = gtk.FileChooserDialog(title=_('Select folder for mount point'), action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) fs.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) fs.add_button(gtk.STOCK_OPEN, gtk.RESPONSE_OK) fs.set_current_folder(self.btn_filesystemMountpoint.get_label()) if fs.run() == gtk.RESPONSE_OK: filename = fs.get_filename() if self._config.device_sync.device_type == 'filesystem': self._config.device_sync.device_folder = filename # Request an update of the mountpoint button self.on_combobox_device_type_changed(None) fs.destroy() def on_btn_playlist_folder_clicked(self, widget): fs = gtk.FileChooserDialog(title=_('Select folder for playlists'), action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) fs.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) fs.add_button(gtk.STOCK_OPEN, gtk.RESPONSE_OK) fs.set_current_folder(self.btn_playlistfolder.get_label()) if fs.run() == gtk.RESPONSE_OK: filename = util.relpath(self._config.device_sync.device_folder, fs.get_filename()) if self._config.device_sync.device_type == 'filesystem': self._config.device_sync.playlists.folder = filename self.btn_playlistfolder.set_label(filename) children = self.btn_playlistfolder.get_children() if children: label = children.pop() label.set_alignment(0., .5) fs.destroy() gpodder-3.5.2/src/gpodder/gtkui/desktop/sync.py0000644000175000017500000003531112220076757021125 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.gtkui.desktop.sync - Glue code between GTK+ UI and sync module # Thomas Perl ; 2009-09-05 (based on code from gui.py) # Ported to gPodder 3 by Joseph Wickremasinghe in June 2012 import os import gpodder _ = gpodder.gettext from gpodder import util from gpodder import sync from gpodder.gtkui.desktop.episodeselector import gPodderEpisodeSelector from gpodder.gtkui.desktop.deviceplaylist import gPodderDevicePlaylist import logging logger = logging.getLogger(__name__) class gPodderSyncUI(object): def __init__(self, config, notification, parent_window, show_confirmation, update_episode_list_icons, update_podcast_list_model, preferences_widget, channels, download_status_model, download_queue_manager, enable_download_list_update, commit_changes_to_database, delete_episode_list): self.device = None self._config = config self.notification = notification self.parent_window = parent_window self.show_confirmation = show_confirmation self.update_episode_list_icons = update_episode_list_icons self.update_podcast_list_model = update_podcast_list_model self.preferences_widget = preferences_widget self.channels=channels self.download_status_model = download_status_model self.download_queue_manager = download_queue_manager self.enable_download_list_update = enable_download_list_update self.commit_changes_to_database = commit_changes_to_database self.delete_episode_list=delete_episode_list def _filter_sync_episodes(self, channels, only_downloaded=False): """Return a list of episodes for device synchronization If only_downloaded is True, this will skip episodes that have not been downloaded yet and podcasts that are marked as "Do not synchronize to my device". """ episodes = [] for channel in channels: if only_downloaded or not channel.sync_to_mp3_player: logger.info('Skipping channel: %s', channel.title) continue for episode in channel.get_all_episodes(): if (episode.was_downloaded(and_exists=True) or not only_downloaded): episodes.append(episode) return episodes def _show_message_unconfigured(self): title = _('No device configured') message = _('Please set up your device in the preferences dialog.') self.notification(message, title, widget=self.preferences_widget, important=True) def _show_message_cannot_open(self): title = _('Cannot open device') message = _('Please check the settings in the preferences dialog.') self.notification(message, title, widget=self.preferences_widget, important=True) def on_synchronize_episodes(self, channels, episodes=None, force_played=True): device = sync.open_device(self) if device is None: return self._show_message_unconfigured() if not device.open(): return self._show_message_cannot_open() else: # Only set if device is configured and opened successfully self.device = device if episodes is None: force_played = False episodes = self._filter_sync_episodes(channels) def check_free_space(): # "Will we add this episode to the device?" def will_add(episode): # If already on-device, it won't take up any space if device.episode_on_device(episode): return False # Might not be synced if it's played already if (not force_played and self._config.device_sync.skip_played_episodes): return False # In all other cases, we expect the episode to be # synchronized to the device, so "answer" positive return True # "What is the file size of this episode?" def file_size(episode): filename = episode.local_filename(create=False) if filename is None: return 0 return util.calculate_size(str(filename)) # Calculate total size of sync and free space on device total_size = sum(file_size(e) for e in episodes if will_add(e)) free_space = max(device.get_free_space(), 0) if total_size > free_space: title = _('Not enough space left on device') message = (_('Additional free space required: %(required_space)s\nDo you want to continue?') % {'required_space': util.format_filesize(total_size - free_space)}) if not self.show_confirmation(message, title): device.cancel() device.close() return #enable updating of UI self.enable_download_list_update() #Update device playlists #General approach is as follows: #When a episode is downloaded and synched, it is added to the #standard playlist for that podcast which is then written to #the device. #After the user has played that episode on their device, they #can delete that episode from their device. #At the next sync, gPodder will then compare the standard #podcast-specific playlists on the device (as written by #gPodder during the last sync), with the episodes on the #device.If there is an episode referenced in the playlist #that is no longer on the device, gPodder will assume that #the episode has already been synced and subsequently deleted #from the device, and will hence mark that episode as deleted #in gPodder. If there are no playlists, nothing is deleted. #At the next sync, the playlists will be refreshed based on #the downloaded, undeleted episodes in gPodder, and the #cycle begins again... def resume_sync(episode_urls, channel_urls,progress): if progress is not None: progress.on_finished() #rest of sync process should continue here self.commit_changes_to_database() for current_channel in self.channels: #only sync those channels marked for syncing if (current_channel.sync_to_mp3_player and self._config.device_sync.playlists.create): #get playlist object playlist=gPodderDevicePlaylist(self._config, current_channel.title) #need to refresh episode list so that #deleted episodes aren't included in playlists episodes_for_playlist=sorted(current_channel.get_episodes(gpodder.STATE_DOWNLOADED), key=lambda ep: ep.published) #don't add played episodes to playlist if skip_played_episodes is True if self._config.device_sync.skip_played_episodes: episodes_for_playlist=filter(lambda ep: ep.is_new, episodes_for_playlist) playlist.write_m3u(episodes_for_playlist) #enable updating of UI self.enable_download_list_update() if self._config.device_sync.playlists.create: title = _('Update successful') message = _('The playlist on your MP3 player has been updated.') self.notification(message, title, widget=self.preferences_widget) # Finally start the synchronization process @util.run_in_background def sync_thread_func(): device.add_sync_tasks(episodes, force_played=force_played, done_callback=self.enable_download_list_update) return if self._config.device_sync.playlists.create: try: episodes_to_delete=[] if self._config.device_sync.playlists.two_way_sync: for current_channel in self.channels: #only include channels that are included in the sync if current_channel.sync_to_mp3_player: #get playlist object playlist=gPodderDevicePlaylist(self._config, current_channel.title) #get episodes to be written to playlist episodes_for_playlist=sorted(current_channel.get_episodes(gpodder.STATE_DOWNLOADED), key=lambda ep: ep.published) episode_keys=map(playlist.get_absolute_filename_for_playlist, episodes_for_playlist) episode_dict=dict(zip(episode_keys, episodes_for_playlist)) #then get episodes in playlist (if it exists) already on device episodes_in_playlists = playlist.read_m3u() #if playlist doesn't exist (yet) episodes_in_playlist will be empty if episodes_in_playlists: for episode_filename in episodes_in_playlists: if not(os.path.exists(os.path.join(playlist.mountpoint, episode_filename))): #episode was synced but no longer on device #i.e. must have been deleted by user, so delete from gpodder try: episodes_to_delete.append(episode_dict[episode_filename]) except KeyError, ioe: logger.warn('Episode %s, removed from device has already been deleted from gpodder', episode_filename) #delete all episodes from gpodder (will prompt user) #not using playlists to delete def auto_delete_callback(episodes): if not episodes: #episodes were deleted on device #but user decided not to delete them from gpodder #so jump straight to sync logger.info ('Starting sync - no episodes selected for deletion') resume_sync([],[],None) else: #episodes need to be deleted from gpodder for episode_to_delete in episodes: logger.info("Deleting episode %s", episode_to_delete.title) logger.info ('Will start sync - after deleting episodes') self.delete_episode_list(episodes,False, True,resume_sync) return if episodes_to_delete: columns = ( ('markup_delete_episodes', None, None, _('Episode')), ) gPodderEpisodeSelector(self.parent_window, title = _('Episodes have been deleted on device'), instructions = 'Select the episodes you want to delete:', episodes = episodes_to_delete, selected = [True,]*len(episodes_to_delete), columns = columns, callback = auto_delete_callback, _config=self._config) else: logger.warning("Starting sync - no episodes to delete") resume_sync([],[],None) except IOError, ioe: title = _('Error writing playlist files') message = _(str(ioe)) self.notification(message, title, widget=self.preferences_widget) else: logger.info ('Not creating playlists - starting sync') resume_sync([],[],None) # This function is used to remove files from the device def cleanup_episodes(): # 'skip_played_episodes' must be used or else all the # played tracks will be copied then immediately deleted if (self._config.device_sync.delete_played_episodes and self._config.device_sync.skip_played_episodes): all_episodes = self._filter_sync_episodes(channels, only_downloaded=False) for local_episode in all_episodes: episode = device.episode_on_device(local_episode) if episode is None: continue if local_episode.state == gpodder.STATE_DELETED: logger.info('Removing episode from device: %s', episode.title) device.remove_track(episode) # When this is done, start the callback in the UI code util.idle_add(check_free_space) # This will run the following chain of actions: # 1. Remove old episodes (in worker thread) # 2. Check for free space (in UI thread) # 3. Sync the device (in UI thread) util.run_in_background(cleanup_episodes) gpodder-3.5.2/src/gpodder/gtkui/desktop/welcome.py0000644000175000017500000000260112220076757021600 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gpodder _ = gpodder.gettext from gpodder.gtkui.interface.common import BuilderWidget class gPodderWelcome(BuilderWidget): PADDING = 10 def new(self): for widget in self.vbox_buttons.get_children(): for child in widget.get_children(): if isinstance(child, gtk.Alignment): child.set_padding(self.PADDING, self.PADDING, self.PADDING, self.PADDING) else: child.set_padding(self.PADDING, self.PADDING) def on_btnCancel_clicked(self, button): self.main_window.response(gtk.RESPONSE_CANCEL) gpodder-3.5.2/src/gpodder/gtkui/interface/0000755000175000017500000000000012220346122020045 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/gtkui/interface/__init__.py0000644000175000017500000000137412220076757022201 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # gpodder-3.5.2/src/gpodder/gtkui/interface/addpodcast.py0000644000175000017500000000643512220076757022553 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gpodder _ = gpodder.gettext from gpodder.gtkui.interface.common import BuilderWidget from gpodder import util class gPodderAddPodcast(BuilderWidget): def new(self): if not hasattr(self, 'add_podcast_list'): self.add_podcast_list = None if hasattr(self, 'custom_label'): self.label_add.set_text(self.custom_label) if hasattr(self, 'custom_title'): self.gPodderAddPodcast.set_title(self.custom_title) if hasattr(self, 'preset_url'): self.entry_url.set_text(self.preset_url) self.entry_url.connect('activate', self.on_entry_url_activate) self.gPodderAddPodcast.show() if not hasattr(self, 'preset_url'): # Fill the entry if a valid URL is in the clipboard, but # only if there's no preset_url available (see bug 1132) clipboard = gtk.Clipboard(selection='PRIMARY') def receive_clipboard_text(clipboard, text, second_try): # Heuristic: If there is a space in the clipboard # text, assume it's some arbitrary text, and no URL if text is not None and ' ' not in text: url = util.normalize_feed_url(text) if url is not None: self.entry_url.set_text(url) self.entry_url.set_position(-1) return if not second_try: clipboard = gtk.Clipboard() clipboard.request_text(receive_clipboard_text, True) clipboard.request_text(receive_clipboard_text, False) def on_btn_close_clicked(self, widget): self.gPodderAddPodcast.destroy() def on_btn_paste_clicked(self, widget): clipboard = gtk.Clipboard() clipboard.request_text(self.receive_clipboard_text) def receive_clipboard_text(self, clipboard, text, data=None): if text is not None: self.entry_url.set_text(text) else: self.show_message(_('Nothing to paste.'), _('Clipboard is empty')) def on_entry_url_changed(self, widget): self.btn_add.set_sensitive(self.entry_url.get_text().strip() != '') def on_entry_url_activate(self, widget): self.on_btn_add_clicked(widget) def on_btn_add_clicked(self, widget): url = self.entry_url.get_text() self.on_btn_close_clicked(widget) if self.add_podcast_list is not None: title = None # FIXME: Add title GUI element self.add_podcast_list([(title, url)]) gpodder-3.5.2/src/gpodder/gtkui/interface/common.py0000644000175000017500000002622512220076757021734 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import os import shutil import gpodder _ = gpodder.gettext from gpodder import util from gpodder.gtkui.base import GtkBuilderWidget class BuilderWidget(GtkBuilderWidget): def __init__(self, parent, **kwargs): self._window_iconified = False self._window_visible = False GtkBuilderWidget.__init__(self, gpodder.ui_folders, gpodder.textdomain, **kwargs) # Enable support for tracking iconified state if hasattr(self, 'on_iconify') and hasattr(self, 'on_uniconify'): self.main_window.connect('window-state-event', \ self._on_window_state_event_iconified) # Enable support for tracking visibility state self.main_window.connect('visibility-notify-event', \ self._on_window_state_event_visibility) if parent is not None: self.main_window.set_transient_for(parent) if hasattr(self, 'center_on_widget'): (x, y) = parent.get_position() a = self.center_on_widget.allocation (x, y) = (x + a.x, y + a.y) (w, h) = (a.width, a.height) (pw, ph) = self.main_window.get_size() self.main_window.move(x + w/2 - pw/2, y + h/2 - ph/2) def _on_window_state_event_visibility(self, widget, event): if event.state & gtk.gdk.VISIBILITY_FULLY_OBSCURED: self._window_visible = False else: self._window_visible = True return False def _on_window_state_event_iconified(self, widget, event): if event.new_window_state & gtk.gdk.WINDOW_STATE_ICONIFIED: if not self._window_iconified: self._window_iconified = True self.on_iconify() else: if self._window_iconified: self._window_iconified = False self.on_uniconify() return False def is_iconified(self): return self._window_iconified def notification(self, message, title=None, important=False, widget=None): util.idle_add(self.show_message, message, title, important, widget) def get_dialog_parent(self): """Return a gtk.Window that should be the parent of dialogs""" return self.main_window def show_message(self, message, title=None, important=False, widget=None): if important: dlg = gtk.MessageDialog(self.main_window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK) if title: dlg.set_title(str(title)) dlg.set_markup('%s\n\n%s' % (title, message)) else: dlg.set_markup('%s' % (message)) dlg.run() dlg.destroy() else: gpodder.user_extensions.on_notification_show(title, message) def show_confirmation(self, message, title=None): dlg = gtk.MessageDialog(self.main_window, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO) if title: dlg.set_title(str(title)) dlg.set_markup('%s\n\n%s' % (title, message)) else: dlg.set_markup('%s' % (message)) response = dlg.run() dlg.destroy() return response == gtk.RESPONSE_YES def show_text_edit_dialog(self, title, prompt, text=None, empty=False, \ is_url=False, affirmative_text=gtk.STOCK_OK): dialog = gtk.Dialog(title, self.get_dialog_parent(), \ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT) dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dialog.add_button(affirmative_text, gtk.RESPONSE_OK) dialog.set_has_separator(False) dialog.set_default_size(300, -1) dialog.set_default_response(gtk.RESPONSE_OK) text_entry = gtk.Entry() text_entry.set_activates_default(True) if text is not None: text_entry.set_text(text) text_entry.select_region(0, -1) if not empty: def on_text_changed(editable): can_confirm = (editable.get_text() != '') dialog.set_response_sensitive(gtk.RESPONSE_OK, can_confirm) text_entry.connect('changed', on_text_changed) if text is None: dialog.set_response_sensitive(gtk.RESPONSE_OK, False) hbox = gtk.HBox() hbox.set_border_width(10) hbox.set_spacing(10) hbox.pack_start(gtk.Label(prompt), False, False) hbox.pack_start(text_entry, True, True) dialog.vbox.pack_start(hbox, True, True) dialog.show_all() response = dialog.run() result = text_entry.get_text() dialog.destroy() if response == gtk.RESPONSE_OK: return result else: return None def show_login_dialog(self, title, message, username=None, password=None, username_prompt=None, register_callback=None, register_text=None): if username_prompt is None: username_prompt = _('Username') if register_text is None: register_text = _('New user') dialog = gtk.MessageDialog( self.main_window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, gtk.BUTTONS_CANCEL) dialog.add_button(_('Login'), gtk.RESPONSE_OK) dialog.set_image(gtk.image_new_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_DIALOG)) dialog.set_title(_('Authentication required')) dialog.set_markup('' + title + '') dialog.format_secondary_markup(message) dialog.set_default_response(gtk.RESPONSE_OK) if register_callback is not None: dialog.add_button(register_text, gtk.RESPONSE_HELP) username_entry = gtk.Entry() password_entry = gtk.Entry() username_entry.connect('activate', lambda w: password_entry.grab_focus()) password_entry.set_visibility(False) password_entry.set_activates_default(True) if username is not None: username_entry.set_text(username) if password is not None: password_entry.set_text(password) table = gtk.Table(2, 2) table.set_row_spacings(6) table.set_col_spacings(6) username_label = gtk.Label() username_label.set_markup('' + username_prompt + ':') username_label.set_alignment(0.0, 0.5) table.attach(username_label, 0, 1, 0, 1, gtk.FILL, 0) table.attach(username_entry, 1, 2, 0, 1) password_label = gtk.Label() password_label.set_markup('' + _('Password') + ':') password_label.set_alignment(0.0, 0.5) table.attach(password_label, 0, 1, 1, 2, gtk.FILL, 0) table.attach(password_entry, 1, 2, 1, 2) dialog.vbox.pack_end(table, True, True, 0) dialog.show_all() response = dialog.run() while response == gtk.RESPONSE_HELP: register_callback() response = dialog.run() password_entry.set_visibility(True) username = username_entry.get_text() password = password_entry.get_text() success = (response == gtk.RESPONSE_OK) dialog.destroy() return (success, (username, password)) def show_copy_dialog(self, src_filename, dst_filename=None, dst_directory=None, title=_('Select destination')): if dst_filename is None: dst_filename = src_filename if dst_directory is None: dst_directory = os.path.expanduser('~') base, extension = os.path.splitext(src_filename) if not dst_filename.endswith(extension): dst_filename += extension dlg = gtk.FileChooserDialog(title=title, parent=self.main_window, action=gtk.FILE_CHOOSER_ACTION_SAVE) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_OK) dlg.set_do_overwrite_confirmation(True) dlg.set_current_name(os.path.basename(dst_filename)) dlg.set_current_folder(dst_directory) result = False folder = dst_directory if dlg.run() == gtk.RESPONSE_OK: result = True dst_filename = dlg.get_filename() folder = dlg.get_current_folder() if not dst_filename.endswith(extension): dst_filename += extension shutil.copyfile(src_filename, dst_filename) dlg.destroy() return (result, folder) class TreeViewHelper(object): """Container for gPodder-specific TreeView attributes.""" LAST_TOOLTIP = '_gpodder_last_tooltip' CAN_TOOLTIP = '_gpodder_can_tooltip' ROLE = '_gpodder_role' COLUMNS = '_gpodder_columns' # Enum for the role attribute ROLE_PODCASTS, ROLE_EPISODES, ROLE_DOWNLOADS = range(3) @classmethod def set(cls, treeview, role): setattr(treeview, cls.LAST_TOOLTIP, None) setattr(treeview, cls.CAN_TOOLTIP, True) setattr(treeview, cls.ROLE, role) @staticmethod def make_search_equal_func(gpodder_model): def func(model, column, key, iter): if model is None: return True key = key.lower() for column in gpodder_model.SEARCH_COLUMNS: if key in model.get_value(iter, column).lower(): return False return True return func @classmethod def register_column(cls, treeview, column): if not hasattr(treeview, cls.COLUMNS): setattr(treeview, cls.COLUMNS, []) columns = getattr(treeview, cls.COLUMNS) columns.append(column) @classmethod def get_columns(cls, treeview): return getattr(treeview, cls.COLUMNS, []) @staticmethod def make_popup_position_func(widget): def position_func(menu): x, y = widget.get_bin_window().get_origin() # If there's a selection, place the popup menu on top of # the first-selected row (otherwise in the top left corner) selection = widget.get_selection() model, paths = selection.get_selected_rows() if paths: path = paths[0] area = widget.get_cell_area(path, widget.get_column(0)) x += area.x y += area.y return (x, y, True) return position_func gpodder-3.5.2/src/gpodder/gtkui/interface/configeditor.py0000644000175000017500000001006512220076757023113 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import cgi import gpodder _ = gpodder.gettext from gpodder.gtkui.config import ConfigModel from gpodder.gtkui.interface.common import BuilderWidget class gPodderConfigEditor(BuilderWidget): def new(self): name_column = gtk.TreeViewColumn(_('Setting')) name_renderer = gtk.CellRendererText() name_column.pack_start(name_renderer) name_column.add_attribute(name_renderer, 'text', 0) name_column.add_attribute(name_renderer, 'style', 5) self.configeditor.append_column(name_column) value_column = gtk.TreeViewColumn(_('Set to')) value_check_renderer = gtk.CellRendererToggle() value_column.pack_start(value_check_renderer, expand=False) value_column.add_attribute(value_check_renderer, 'active', 7) value_column.add_attribute(value_check_renderer, 'visible', 6) value_column.add_attribute(value_check_renderer, 'activatable', 6) value_check_renderer.connect('toggled', self.value_toggled) value_renderer = gtk.CellRendererText() value_column.pack_start(value_renderer) value_column.add_attribute(value_renderer, 'text', 2) value_column.add_attribute(value_renderer, 'visible', 4) value_column.add_attribute(value_renderer, 'editable', 4) value_column.add_attribute(value_renderer, 'style', 5) value_renderer.connect('edited', self.value_edited) self.configeditor.append_column(value_column) self.model = ConfigModel(self._config) self.filter = self.model.filter_new() self.filter.set_visible_func(self.visible_func) self.configeditor.set_model(self.filter) self.configeditor.set_rules_hint(True) def visible_func(self, model, iter, user_data=None): text = self.entryFilter.get_text().lower() if text == '': return True else: # either the variable name or its value return (text in model.get_value(iter, 0).lower() or text in model.get_value(iter, 2).lower()) def value_edited(self, renderer, path, new_text): model = self.configeditor.get_model() iter = model.get_iter(path) name = model.get_value(iter, 0) type_cute = model.get_value(iter, 1) if not self._config.update_field(name, new_text): message = _('Cannot set %(field)s to %(value)s. Needed data type: %(datatype)s') d = {'field': cgi.escape(name), 'value': cgi.escape(new_text), 'datatype': cgi.escape(type_cute)} self.notification(message % d, _('Error setting option')) def value_toggled(self, renderer, path): model = self.configeditor.get_model() iter = model.get_iter(path) field_name = model.get_value(iter, 0) field_type = model.get_value(iter, 3) # Flip the boolean config flag if field_type == bool: self._config.toggle_flag(field_name) def on_entryFilter_changed(self, widget): self.filter.refilter() def on_btnShowAll_clicked(self, widget): self.entryFilter.set_text('') self.entryFilter.grab_focus() def on_btnClose_clicked(self, widget): self.gPodderConfigEditor.destroy() def on_gPodderConfigEditor_destroy(self, widget): self.model.stop_observing() gpodder-3.5.2/src/gpodder/gtkui/interface/progress.py0000644000175000017500000000761612220076757022313 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gobject import pango import gpodder _ = gpodder.gettext from gpodder.gtkui.widgets import SpinningProgressIndicator class ProgressIndicator(object): # Delayed time until window is shown (for short operations) DELAY = 500 # Time between GUI updates after window creation INTERVAL = 100 def __init__(self, title, subtitle=None, cancellable=False, parent=None): self.title = title self.subtitle = subtitle self.cancellable = cancellable self.parent = parent self.dialog = None self.progressbar = None self.indicator = None self._initial_message = None self._initial_progress = None self._progress_set = False self.source_id = gobject.timeout_add(self.DELAY, self._create_progress) def _on_delete_event(self, window, event): if self.cancellable: self.dialog.response(gtk.RESPONSE_CANCEL) return True def _create_progress(self): self.dialog = gtk.MessageDialog(self.parent, \ 0, 0, gtk.BUTTONS_CANCEL, self.subtitle or self.title) self.dialog.set_modal(True) self.dialog.connect('delete-event', self._on_delete_event) self.dialog.set_title(self.title) self.dialog.set_deletable(self.cancellable) # Avoid selectable text (requires PyGTK >= 2.22) if hasattr(self.dialog, 'get_message_area'): for label in self.dialog.get_message_area(): if isinstance(label, gtk.Label): label.set_selectable(False) self.dialog.set_response_sensitive(gtk.RESPONSE_CANCEL, \ self.cancellable) self.progressbar = gtk.ProgressBar() self.progressbar.set_ellipsize(pango.ELLIPSIZE_END) # If the window is shown after the first update, set the progress # info so that when the window appears, data is there already if self._initial_progress is not None: self.progressbar.set_fraction(self._initial_progress) if self._initial_message is not None: self.progressbar.set_text(self._initial_message) self.dialog.vbox.add(self.progressbar) self.indicator = SpinningProgressIndicator() self.dialog.set_image(self.indicator) self.dialog.show_all() gobject.source_remove(self.source_id) self.source_id = gobject.timeout_add(self.INTERVAL, self._update_gui) return False def _update_gui(self): if self.indicator: self.indicator.step_animation() if not self._progress_set and self.progressbar: self.progressbar.pulse() return True def on_message(self, message): if self.progressbar: self.progressbar.set_text(message) else: self._initial_message = message def on_progress(self, progress): self._progress_set = True if self.progressbar: self.progressbar.set_fraction(progress) else: self._initial_progress = progress def on_finished(self): if self.dialog is not None: self.dialog.destroy() gobject.source_remove(self.source_id) gpodder-3.5.2/src/gpodder/gtkui/__init__.py0000644000175000017500000000137412220076757020241 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # gpodder-3.5.2/src/gpodder/gtkui/base.py0000644000175000017500000001120612220076757017407 0ustar thpthp00000000000000# -*- coding: utf-8 -*- """ UI Base Module for GtkBuilder Based on SimpleGladeApp.py Copyright (C) 2004 Sandino Flores Moreno """ # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA import os import sys import re import tokenize import gtk class GtkBuilderWidget(object): def __init__(self, ui_folders, textdomain, **kwargs): """ Loads the UI file from the specified folder (with translations from the textdomain) and initializes attributes. ui_folders: List of folders with GtkBuilder .ui files in search order textdomain: The textdomain to be used for translating strings **kwargs: Keyword arguments will be set as attributes to this window """ for key, value in kwargs.items(): setattr(self, key, value) self.builder = gtk.Builder() self.builder.set_translation_domain(textdomain) #print >>sys.stderr, 'Creating new from file', self.__class__.__name__ ui_file = '%s.ui' % self.__class__.__name__.lower() # Search for the UI file in the UI folders, stop after first match for ui_folder in ui_folders: filename = os.path.join(ui_folder, ui_file) if os.path.exists(filename): self.builder.add_from_file(filename) break self.builder.connect_signals(self) self.set_attributes() self.new() def set_attributes(self): """ Convert widget names to attributes of this object. It means a widget named vbox-dialog in GtkBuilder is refered using self.vbox_dialog in the code. """ for widget in self.builder.get_objects(): # Just to be safe - every widget from the builder is buildable if not isinstance(widget, gtk.Buildable): continue # The following call looks ugly, but see Gnome bug 591085 widget_name = gtk.Buildable.get_name(widget) widget_api_name = '_'.join(re.findall(tokenize.Name, widget_name)) if hasattr(self, widget_api_name): raise AttributeError("instance %s already has an attribute %s" % (self,widget_api_name)) else: setattr(self, widget_api_name, widget) @property def main_window(self): """Returns the main window of this GtkBuilderWidget""" return getattr(self, self.__class__.__name__) def new(self): """ Method called when the user interface is loaded and ready to be used. At this moment, the widgets are loaded and can be refered as self.widget_name """ pass def main(self): """ Starts the main loop of processing events. The default implementation calls gtk.main() Useful for applications that needs a non gtk main loop. For example, applications based on gstreamer needs to override this method with gst.main() Do not directly call this method in your programs. Use the method run() instead. """ gtk.main() def quit(self): """ Quit processing events. The default implementation calls gtk.main_quit() Useful for applications that needs a non gtk main loop. For example, applications based on gstreamer needs to override this method with gst.main_quit() """ gtk.main_quit() def run(self): """ Starts the main loop of processing events checking for Control-C. The default implementation checks wheter a Control-C is pressed, then calls on_keyboard_interrupt(). Use this method for starting programs. """ try: self.main() except KeyboardInterrupt: self.on_keyboard_interrupt() def on_keyboard_interrupt(self): """ This method is called by the default implementation of run() after a program is finished by pressing Control-C. """ pass gpodder-3.5.2/src/gpodder/gtkui/config.py0000644000175000017500000001335712220076757017753 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.gtkui.config -- Config object with GTK+ support (2009-08-24) # import gtk import pango import gpodder from gpodder import util from gpodder import config _ = gpodder.gettext class ConfigModel(gtk.ListStore): C_NAME, C_TYPE_TEXT, C_VALUE_TEXT, C_TYPE, C_EDITABLE, C_FONT_STYLE, \ C_IS_BOOLEAN, C_BOOLEAN_VALUE = range(8) def __init__(self, config): gtk.ListStore.__init__(self, str, str, str, object, \ bool, int, bool, bool) self._config = config self._fill_model() self._config.add_observer(self._on_update) def _type_as_string(self, type): if type == int: return _('Integer') elif type == float: return _('Float') elif type == bool: return _('Boolean') else: return _('String') def _fill_model(self): self.clear() for key in sorted(self._config.all_keys()): # Ignore Gtk window state data (position, size, ...) if key.startswith('ui.gtk.state.'): continue value = self._config._lookup(key) fieldtype = type(value) style = pango.STYLE_NORMAL #if value == default: # style = pango.STYLE_NORMAL #else: # style = pango.STYLE_ITALIC self.append((key, self._type_as_string(fieldtype), config.config_value_to_string(value), fieldtype, fieldtype is not bool, style, fieldtype is bool, bool(value))) def _on_update(self, name, old_value, new_value): for row in self: if row[self.C_NAME] == name: style = pango.STYLE_NORMAL #if new_value == self._config.Settings[name]: # style = pango.STYLE_NORMAL #else: # style = pango.STYLE_ITALIC new_value_text = config.config_value_to_string(new_value) self.set(row.iter, \ self.C_VALUE_TEXT, new_value_text, self.C_BOOLEAN_VALUE, bool(new_value), self.C_FONT_STYLE, style) break def stop_observing(self): self._config.remove_observer(self._on_update) class UIConfig(config.Config): def __init__(self, filename='gpodder.conf'): config.Config.__init__(self, filename) self.__ignore_window_events = False def connect_gtk_editable(self, name, editable): editable.delete_text(0, -1) editable.insert_text(str(getattr(self, name))) def _editable_changed(editable): setattr(self, name, editable.get_chars(0, -1)) editable.connect('changed', _editable_changed) def connect_gtk_spinbutton(self, name, spinbutton): spinbutton.set_value(getattr(self, name)) def _spinbutton_changed(spinbutton): setattr(self, name, spinbutton.get_value()) spinbutton.connect('value-changed', _spinbutton_changed) def connect_gtk_paned(self, name, paned): paned.set_position(getattr(self, name)) paned_child = paned.get_child1() def _child_size_allocate(x, y): setattr(self, name, paned.get_position()) paned_child.connect('size-allocate', _child_size_allocate) def connect_gtk_togglebutton(self, name, togglebutton): togglebutton.set_active(getattr(self, name)) def _togglebutton_toggled(togglebutton): setattr(self, name, togglebutton.get_active()) togglebutton.connect('toggled', _togglebutton_toggled) def connect_gtk_window(self, window, config_prefix, show_window=False): cfg = getattr(self.ui.gtk.state, config_prefix) window.resize(cfg.width, cfg.height) if cfg.x == -1 or cfg.y == -1: window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) else: window.move(cfg.x, cfg.y) # Ignore events while we're connecting to the window self.__ignore_window_events = True def _receive_configure_event(widget, event): x_pos, y_pos = event.x, event.y width_size, height_size = event.width, event.height if not self.__ignore_window_events and not cfg.maximized: cfg.x = x_pos cfg.y = y_pos cfg.width = width_size cfg.height = height_size window.connect('configure-event', _receive_configure_event) def _receive_window_state(widget, event): new_value = bool(event.new_window_state & gtk.gdk.WINDOW_STATE_MAXIMIZED) cfg.maximized = new_value window.connect('window-state-event', _receive_window_state) # After the window has been set up, we enable events again def _enable_window_events(): self.__ignore_window_events = False util.idle_add(_enable_window_events) if show_window: window.show() if cfg.maximized: window.maximize() gpodder-3.5.2/src/gpodder/gtkui/desktopfile.py0000644000175000017500000001157312220076757021015 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # libplayers.py -- get list of potential playback apps # thomas perl 20060329 # # import glob import os.path import threading from ConfigParser import RawConfigParser import gobject import gtk import gtk.gdk import gpodder _ = gpodder.gettext # where are the .desktop files located? userappsdirs = [ '/usr/share/applications/', '/usr/local/share/applications/', '/usr/share/applications/kde/' ] # the name of the section in the .desktop files sect = 'Desktop Entry' class PlayerListModel(gtk.ListStore): C_ICON, C_NAME, C_COMMAND, C_CUSTOM = range(4) def __init__(self): gtk.ListStore.__init__(self, gtk.gdk.Pixbuf, str, str, bool) def insert_app(self, pixbuf, name, command): self.append((pixbuf, name, command, False)) def get_command(self, index): return self[index][self.C_COMMAND] def get_index(self, value): for index, row in enumerate(self): if value == row[self.C_COMMAND]: return index last_row = self[-1] name = _('Command: %s') % value if last_row[self.C_CUSTOM]: last_row[self.C_COMMAND] = value last_row[self.C_NAME] = name else: self.append((None, name, value, True)) return len(self)-1 @classmethod def is_separator(cls, model, iter): return model.get_value(iter, cls.C_COMMAND) == '' class UserApplication(object): def __init__(self, name, cmd, mime, icon): self.name = name self.cmd = cmd self.icon = icon self.mime = mime def get_icon(self): if self.icon is not None: # Load it from an absolute filename if os.path.exists(self.icon): try: return gtk.gdk.pixbuf_new_from_file_at_size(self.icon, 24, 24) except gobject.GError, ge: pass # Load it from the current icon theme (icon_name, extension) = os.path.splitext(os.path.basename(self.icon)) theme = gtk.IconTheme() if theme.has_icon(icon_name): return theme.load_icon(icon_name, 24, 0) def is_mime(self, mimetype): return self.mime.find(mimetype+'/') != -1 class UserAppsReader(object): def __init__(self, mimetypes): self.apps = [] self.mimetypes = mimetypes self.__has_read = False self.__finished = threading.Event() self.__has_sep = False self.apps.append(UserApplication(_('Default application'), 'default', ';'.join((mime+'/*' for mime in self.mimetypes)), gtk.STOCK_OPEN)) def add_separator(self): self.apps.append(UserApplication('', '', ';'.join((mime+'/*' for mime in self.mimetypes)), '')) self.__has_sep = True def read( self): if self.__has_read: return self.__has_read = True for dir in userappsdirs: if os.path.exists( dir): for file in glob.glob(os.path.join(dir, '*.desktop')): self.parse_and_append( file) self.__finished.set() def parse_and_append( self, filename): try: parser = RawConfigParser() parser.read([filename]) if not parser.has_section(sect): return # Find out if we need it by comparing mime types app_mime = parser.get(sect, 'MimeType') for needed_type in self.mimetypes: if app_mime.find(needed_type+'/') != -1: app_name = parser.get(sect, 'Name') app_cmd = parser.get(sect, 'Exec') app_icon = parser.get(sect, 'Icon') if not self.__has_sep: self.add_separator() self.apps.append(UserApplication(app_name, app_cmd, app_mime, app_icon)) return except: return def get_model(self, mimetype): self.__finished.wait() model = PlayerListModel() for app in self.apps: if app.is_mime(mimetype): model.insert_app(app.get_icon(), app.name, app.cmd) return model gpodder-3.5.2/src/gpodder/gtkui/download.py0000644000175000017500000001346712220076757020317 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.gtkui.download -- Download management in GUIs (2009-08-24) # Based on code from gpodder.services (thp, 2007-08-24) # import gpodder from gpodder import util from gpodder import download import gtk import cgi import collections _ = gpodder.gettext class DownloadStatusModel(gtk.ListStore): # Symbolic names for our columns, so we know what we're up to C_TASK, C_NAME, C_URL, C_PROGRESS, C_PROGRESS_TEXT, C_ICON_NAME = range(6) SEARCH_COLUMNS = (C_NAME, C_URL) def __init__(self): gtk.ListStore.__init__(self, object, str, str, int, str, str) # Set up stock icon IDs for tasks self._status_ids = collections.defaultdict(lambda: None) self._status_ids[download.DownloadTask.DOWNLOADING] = gtk.STOCK_GO_DOWN self._status_ids[download.DownloadTask.DONE] = gtk.STOCK_APPLY self._status_ids[download.DownloadTask.FAILED] = gtk.STOCK_STOP self._status_ids[download.DownloadTask.CANCELLED] = gtk.STOCK_CANCEL self._status_ids[download.DownloadTask.PAUSED] = gtk.STOCK_MEDIA_PAUSE def _format_message(self, episode, message, podcast): episode = cgi.escape(episode) podcast = cgi.escape(podcast) return '%s\n%s - %s' % (episode, message, podcast) def request_update(self, iter, task=None): if task is None: # Ongoing update request from UI - get task from model task = self.get_value(iter, self.C_TASK) else: # Initial update request - update non-changing fields self.set(iter, self.C_TASK, task, self.C_URL, task.url) if task.status == task.FAILED: status_message = '%s: %s' % (\ task.STATUS_MESSAGE[task.status], \ task.error_message) elif task.status == task.DOWNLOADING: status_message = '%s (%.0f%%, %s/s)' % (\ task.STATUS_MESSAGE[task.status], \ task.progress*100, \ util.format_filesize(task.speed)) else: status_message = task.STATUS_MESSAGE[task.status] if task.progress > 0 and task.progress < 1: current = util.format_filesize(task.progress*task.total_size, digits=1) total = util.format_filesize(task.total_size, digits=1) # Remove unit from current if same as in total # (does: "12 MiB / 24 MiB" => "12 / 24 MiB") current = current.split() if current[-1] == total.split()[-1]: current.pop() current = ' '.join(current) progress_message = ' / '.join((current, total)) elif task.total_size > 0: progress_message = util.format_filesize(task.total_size, \ digits=1) else: progress_message = ('unknown size') self.set(iter, self.C_NAME, self._format_message(task.episode.title, status_message, task.episode.channel.title), self.C_PROGRESS, 100.*task.progress, \ self.C_PROGRESS_TEXT, progress_message, \ self.C_ICON_NAME, self._status_ids[task.status]) def __add_new_task(self, task): iter = self.append() self.request_update(iter, task) def register_task(self, task): util.idle_add(self.__add_new_task, task) def tell_all_tasks_to_quit(self): for row in self: task = row[DownloadStatusModel.C_TASK] if task is not None: # Pause currently-running (and queued) downloads if task.status in (task.QUEUED, task.DOWNLOADING): task.status = task.PAUSED # Delete cancelled and failed downloads if task.status in (task.CANCELLED, task.FAILED): task.removed_from_list() def are_downloads_in_progress(self): """ Returns True if there are any downloads in the QUEUED or DOWNLOADING status, False otherwise. """ for row in self: task = row[DownloadStatusModel.C_TASK] if task is not None and \ task.status in (task.DOWNLOADING, \ task.QUEUED): return True return False class DownloadTaskMonitor(object): """A helper class that abstracts download events""" def __init__(self, episode, on_can_resume, on_can_pause, on_finished): self.episode = episode self._status = None self._on_can_resume = on_can_resume self._on_can_pause = on_can_pause self._on_finished = on_finished def task_updated(self, task): if self.episode.url == task.episode.url and self._status != task.status: if task.status in (task.DONE, task.FAILED, task.CANCELLED): self._on_finished() elif task.status == task.PAUSED: self._on_can_resume() elif task.status in (task.QUEUED, task.DOWNLOADING): self._on_can_pause() self._status = task.status gpodder-3.5.2/src/gpodder/gtkui/draw.py0000644000175000017500000002765712220076757017453 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # draw.py -- Draw routines for gPodder-specific graphics # Thomas Perl , 2007-11-25 # import gpodder import gtk import pango import pangocairo import cairo import StringIO import math class TextExtents(object): def __init__(self, ctx, text): tuple = ctx.text_extents(text) (self.x_bearing, self.y_bearing, self.width, self.height, self.x_advance, self.y_advance) = tuple EPISODE_LIST_ICON_SIZE = 16 RRECT_LEFT_SIDE = 1 RRECT_RIGHT_SIDE = 2 def draw_rounded_rectangle(ctx, x, y, w, h, r=10, left_side_width = None, sides_to_draw=0, close=False): assert left_side_width is not None x = int(x) offset = 0 if close: offset = 0.5 if sides_to_draw & RRECT_LEFT_SIDE: ctx.move_to(x+int(left_side_width)-offset, y+h) ctx.line_to(x+r, y+h) ctx.curve_to(x, y+h, x, y+h, x, y+h-r) ctx.line_to(x, y+r) ctx.curve_to(x, y, x, y, x+r, y) ctx.line_to(x+int(left_side_width)-offset, y) if close: ctx.line_to(x+int(left_side_width)-offset, y+h) if sides_to_draw & RRECT_RIGHT_SIDE: ctx.move_to(x+int(left_side_width)+offset, y) ctx.line_to(x+w-r, y) ctx.curve_to(x+w, y, x+w, y, x+w, y+r) ctx.line_to(x+w, y+h-r) ctx.curve_to(x+w, y+h, x+w, y+h, x+w-r, y+h) ctx.line_to(x+int(left_side_width)+offset, y+h) if close: ctx.line_to(x+int(left_side_width)+offset, y) def rounded_rectangle(ctx, x, y, width, height, radius=4.): """Simple rounded rectangle algorithmn http://www.cairographics.org/samples/rounded_rectangle/ """ degrees = math.pi / 180. ctx.new_sub_path() if width > radius: ctx.arc(x + width - radius, y + radius, radius, -90. * degrees, 0) ctx.arc(x + width - radius, y + height - radius, radius, 0, 90. * degrees) ctx.arc(x + radius, y + height - radius, radius, 90. * degrees, 180. * degrees) ctx.arc(x + radius, y + radius, radius, 180. * degrees, 270. * degrees) ctx.close_path() def draw_text_box_centered(ctx, widget, w_width, w_height, text, font_desc=None, add_progress=None): style = widget.rc_get_style() text_color = style.text[gtk.STATE_PRELIGHT] red, green, blue = text_color.red, text_color.green, text_color.blue text_color = [float(x)/65535. for x in (red, green, blue)] text_color.append(.5) if font_desc is None: font_desc = style.font_desc font_desc.set_size(14*pango.SCALE) pango_context = widget.create_pango_context() layout = pango.Layout(pango_context) layout.set_font_description(font_desc) layout.set_text(text) width, height = layout.get_pixel_size() ctx.move_to(w_width/2-width/2, w_height/2-height/2) ctx.set_source_rgba(*text_color) ctx.show_layout(layout) # Draw an optional progress bar below the text (same width) if add_progress is not None: bar_height = 10 ctx.set_source_rgba(*text_color) ctx.set_line_width(1.) rounded_rectangle(ctx, w_width/2-width/2-.5, w_height/2+height-.5, width+1, bar_height+1) ctx.stroke() rounded_rectangle(ctx, w_width/2-width/2, w_height/2+height, int(width*add_progress)+.5, bar_height) ctx.fill() def draw_cake(percentage, text=None, emblem=None, size=None): # Download percentage bar icon - it turns out the cake is a lie (d'oh!) # ..but the inital idea was to have a cake-style indicator, but that # didn't work as well as the progress bar, but the name stuck.. if size is None: size = EPISODE_LIST_ICON_SIZE surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, size, size) ctx = pangocairo.CairoContext(cairo.Context(surface)) widget = gtk.ProgressBar() style = widget.rc_get_style() bgc = style.bg[gtk.STATE_NORMAL] fgc = style.bg[gtk.STATE_SELECTED] txc = style.text[gtk.STATE_NORMAL] border = 1.5 height = int(size*.4) width = size - 2*border y = (size - height) / 2 + .5 x = border # Background ctx.rectangle(x, y, width, height) ctx.set_source_rgb(bgc.red_float, bgc.green_float, bgc.blue_float) ctx.fill() # Filling if percentage > 0: fill_width = max(1, min(width-2, (width-2)*percentage+.5)) ctx.rectangle(x+1, y+1, fill_width, height-2) ctx.set_source_rgb(fgc.red_float, fgc.green_float, fgc.blue_float) ctx.fill() # Border ctx.rectangle(x, y, width, height) ctx.set_source_rgb(txc.red_float, txc.green_float, txc.blue_float) ctx.set_line_width(1) ctx.stroke() del ctx return surface def draw_text_pill(left_text, right_text, x=0, y=0, border=2, radius=14, font_desc=None): # Create temporary context to calculate the text size ctx = cairo.Context(cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)) # Use GTK+ style of a normal Button widget = gtk.Label() style = widget.rc_get_style() # Padding (in px) at the right edge of the image (for Ubuntu; bug 1533) padding_right = 7 x_border = border*2 if font_desc is None: font_desc = style.font_desc font_desc.set_weight(pango.WEIGHT_BOLD) pango_context = widget.create_pango_context() layout_left = pango.Layout(pango_context) layout_left.set_font_description(font_desc) layout_left.set_text(left_text) layout_right = pango.Layout(pango_context) layout_right.set_font_description(font_desc) layout_right.set_text(right_text) width_left, height_left = layout_left.get_pixel_size() width_right, height_right = layout_right.get_pixel_size() text_height = max(height_left, height_right) image_height = int(y+text_height+border*2) image_width = int(x+width_left+width_right+x_border*4+padding_right) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, image_width, image_height) ctx = pangocairo.CairoContext(cairo.Context(surface)) # Clip so as to not draw on the right padding (for Ubuntu; bug 1533) ctx.rectangle(0, 0, image_width - padding_right, image_height) ctx.clip() if left_text == '0': left_text = None if right_text == '0': right_text = None left_side_width = width_left + x_border*2 right_side_width = width_right + x_border*2 rect_width = left_side_width + right_side_width rect_height = text_height + border*2 if left_text is not None: draw_rounded_rectangle(ctx,x,y,rect_width,rect_height,radius, left_side_width, RRECT_LEFT_SIDE, right_text is None) linear = cairo.LinearGradient(x, y, x+left_side_width/2, y+rect_height/2) linear.add_color_stop_rgba(0, .8, .8, .8, .5) linear.add_color_stop_rgba(.4, .8, .8, .8, .7) linear.add_color_stop_rgba(.6, .8, .8, .8, .6) linear.add_color_stop_rgba(.9, .8, .8, .8, .8) linear.add_color_stop_rgba(1, .8, .8, .8, .9) ctx.set_source(linear) ctx.fill() xpos, ypos, width_left, height = x+1, y+1, left_side_width, rect_height-2 if right_text is None: width_left -= 2 draw_rounded_rectangle(ctx, xpos, ypos, rect_width, height, radius, width_left, RRECT_LEFT_SIDE, right_text is None) ctx.set_source_rgba(1., 1., 1., .3) ctx.set_line_width(1) ctx.stroke() draw_rounded_rectangle(ctx,x,y,rect_width,rect_height,radius, left_side_width, RRECT_LEFT_SIDE, right_text is None) ctx.set_source_rgba(.2, .2, .2, .6) ctx.set_line_width(1) ctx.stroke() ctx.move_to(x+x_border, y+1+border) ctx.set_source_rgba( 0, 0, 0, 1) ctx.show_layout(layout_left) ctx.move_to(x-1+x_border, y+border) ctx.set_source_rgba( 1, 1, 1, 1) ctx.show_layout(layout_left) if right_text is not None: draw_rounded_rectangle(ctx, x, y, rect_width, rect_height, radius, left_side_width, RRECT_RIGHT_SIDE, left_text is None) linear = cairo.LinearGradient(x+left_side_width, y, x+left_side_width+right_side_width/2, y+rect_height) linear.add_color_stop_rgba(0, .2, .2, .2, .9) linear.add_color_stop_rgba(.4, .2, .2, .2, .8) linear.add_color_stop_rgba(.6, .2, .2, .2, .6) linear.add_color_stop_rgba(.9, .2, .2, .2, .7) linear.add_color_stop_rgba(1, .2, .2, .2, .5) ctx.set_source(linear) ctx.fill() xpos, ypos, width, height = x, y+1, rect_width-1, rect_height-2 if left_text is None: xpos, width = x+1, rect_width-2 draw_rounded_rectangle(ctx, xpos, ypos, width, height, radius, left_side_width, RRECT_RIGHT_SIDE, left_text is None) ctx.set_source_rgba(1., 1., 1., .3) ctx.set_line_width(1) ctx.stroke() draw_rounded_rectangle(ctx, x, y, rect_width, rect_height, radius, left_side_width, RRECT_RIGHT_SIDE, left_text is None) ctx.set_source_rgba(.1, .1, .1, .6) ctx.set_line_width(1) ctx.stroke() ctx.move_to(x+left_side_width+x_border, y+1+border) ctx.set_source_rgba( 0, 0, 0, 1) ctx.show_layout(layout_right) ctx.move_to(x-1+left_side_width+x_border, y+border) ctx.set_source_rgba( 1, 1, 1, 1) ctx.show_layout(layout_right) return surface def draw_cake_pixbuf(percentage, text=None, emblem=None): return cairo_surface_to_pixbuf(draw_cake(percentage, text, emblem)) def draw_pill_pixbuf(left_text, right_text): return cairo_surface_to_pixbuf(draw_text_pill(left_text, right_text)) def cairo_surface_to_pixbuf(s): """ Converts a Cairo surface to a Gtk Pixbuf by encoding it as PNG and using the PixbufLoader. """ sio = StringIO.StringIO() try: s.write_to_png(sio) except: # Write an empty PNG file to the StringIO, so # in case of an error we have "something" to # load. This happens in PyCairo < 1.1.6, see: # http://webcvs.cairographics.org/pycairo/NEWS?view=markup # Thanks to Chris Arnold for reporting this bug sio.write('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A\n/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9cMEQkqIyxn3RkAAAAZdEVYdENv\nbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADUlEQVQI12NgYGBgAAAABQABXvMqOgAAAABJ\nRU5ErkJggg==\n'.decode('base64')) pbl = gtk.gdk.PixbufLoader() pbl.write(sio.getvalue()) pbl.close() pixbuf = pbl.get_pixbuf() return pixbuf def draw_flattr_button(widget, flattr_image, flattrs_count): """ Adds the flattrs count to the flattr button """ if isinstance(flattrs_count, int): flattrs_count = str(flattrs_count) pixbuf = gtk.gdk.pixbuf_new_from_file(flattr_image) iwidth, iheight = pixbuf.get_width(), pixbuf.get_height() pixmap, mask = pixbuf.render_pixmap_and_mask() # get default-font style = widget.rc_get_style() font_desc = style.font_desc #font_desc.set_size(12*pango.SCALE) font_desc.set_size(9*pango.SCALE) # set font and text layout = widget.create_pango_layout(flattrs_count) layout.set_font_description(font_desc) fwidth, fheight = layout.get_pixel_size() x = 95 - abs(fwidth / 2) # 95 is the center of the bubble y = abs(iheight / 2) - abs(fheight / 2) cm = pixmap.get_colormap() red = cm.alloc_color('black') gc = pixmap.new_gc(foreground=red) pixmap.draw_layout(gc, x, y, layout) widget.set_from_pixmap(pixmap, mask) gpodder-3.5.2/src/gpodder/gtkui/flattr.py0000644000175000017500000000363212220076757017775 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gtk.gdk import os.path import gpodder _ = gpodder.gettext from gpodder.gtkui import draw IMAGE_FLATTR = os.path.join(gpodder.images_folder, 'button-flattr.png') IMAGE_FLATTR_GREY = os.path.join(gpodder.images_folder, 'button-flattr-grey.png') IMAGE_FLATTRED = os.path.join(gpodder.images_folder, 'button-flattred.png') def set_flattr_button(flattr, payment_url, widget_image, widget_button): if not flattr.api_reachable() or not payment_url: widget_image.hide() widget_button.hide() return False elif not flattr.has_token(): badge = IMAGE_FLATTR_GREY button_text = _('Sign in') return False flattrs, flattred = flattr.get_thing_info(payment_url) can_flattr_this = False if flattred: badge = IMAGE_FLATTRED button_text = _('Flattred') else: badge = IMAGE_FLATTR button_text = _('Flattr this') can_flattr_this = True widget_button.set_label(button_text) widget_button.set_sensitive(can_flattr_this) widget_button.show() draw.draw_flattr_button(widget_image, badge, flattrs) widget_image.show() return can_flattr_this gpodder-3.5.2/src/gpodder/gtkui/macosx.py0000644000175000017500000001065212220076757017773 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import struct import sys from gpodder import util def aeKeyword(fourCharCode): """transform four character code into a long""" return struct.unpack('I', fourCharCode)[0] # for the kCoreEventClass, kAEOpenDocuments, ... constants # comes with macpython from Carbon.AppleEvents import * # all this depends on pyObjc (http://pyobjc.sourceforge.net/). # There may be a way to achieve something equivalent with only # what's in MacPython (see for instance http://mail.python.org/pipermail/pythonmac-sig/2006-May/017373.html) # but I couldn't achieve this ! # Also note that it only works when gPodder is not running ! # For some reason I don't get the events afterwards... try: from AppKit import NSObject from AppKit import NSAppleEventManager from AppKit import NSAppleEventDescriptor class gPodderEventHandler(NSObject): """ handles Apple Events for : - Open With... (and dropping a file on the icon) - "subscribe to podcast" from firefox The code was largely inspired by gedit-osx-delegate.m, from the gedit project (see http://git.gnome.org/browse/gedit/tree/gedit/osx/gedit-osx-delegate.m?id=GEDIT_2_28_3). """ # keeps a reference to the gui.gPodder class gp = None def register(self, gp): """ register all handlers with NSAppleEventManager """ self.gp = gp aem = NSAppleEventManager.sharedAppleEventManager() aem.setEventHandler_andSelector_forEventClass_andEventID_( self, 'openFileEvent:reply:', aeKeyword(kCoreEventClass), aeKeyword(kAEOpenDocuments)) aem.setEventHandler_andSelector_forEventClass_andEventID_( self, 'subscribeEvent:reply:', aeKeyword('GURL'), aeKeyword('GURL')) def openFileEvent_reply_(self, event, reply): """ handles an 'Open With...' event""" urls = [] filelist = event.paramDescriptorForKeyword_(aeKeyword(keyDirectObject)) numberOfItems = filelist.numberOfItems() for i in range(1,numberOfItems+1): fileAliasDesc = filelist.descriptorAtIndex_(i) fileURLDesc = fileAliasDesc.coerceToDescriptorType_(aeKeyword(typeFileURL)) fileURLData = fileURLDesc.data() url = buffer(fileURLData.bytes(),0,fileURLData.length()) url = str(url) util.idle_add(self.gp.on_item_import_from_file_activate, None,url) urls.append(str(url)) print >>sys.stderr,("open Files :",urls) result = NSAppleEventDescriptor.descriptorWithInt32_(42) reply.setParamDescriptor_forKeyword_(result, aeKeyword('----')) def subscribeEvent_reply_(self, event, reply): """ handles a 'Subscribe to...' event""" filelist = event.paramDescriptorForKeyword_(aeKeyword(keyDirectObject)) fileURLData = filelist.data() url = buffer(fileURLData.bytes(),0,fileURLData.length()) url = str(url) print >>sys.stderr,("Subscribe to :"+url) util.idle_add(self.gp.subscribe_to_url, url) result = NSAppleEventDescriptor.descriptorWithInt32_(42) reply.setParamDescriptor_forKeyword_(result, aeKeyword('----')) # global reference to the handler (mustn't be destroyed) handler = gPodderEventHandler.alloc().init() except ImportError: print >> sys.stderr, """ Warning: pyobjc not found. Disabling "Subscribe with" events handling """ handler = None def register_handlers(gp): """ register the events handlers (and keep a reference to gPodder's instance)""" if handler is not None: handler.register(gp) gpodder-3.5.2/src/gpodder/gtkui/main.py0000644000175000017500000045341512220344566017431 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os import platform import gtk import gtk.gdk import gobject import pango import random import sys import shutil import subprocess import glob import time import threading import tempfile import collections import urllib import cgi import gpodder import dbus import dbus.service import dbus.mainloop import dbus.glib from gpodder import core from gpodder import feedcore from gpodder import util from gpodder import opml from gpodder import download from gpodder import my from gpodder import youtube from gpodder import player from gpodder import common import logging logger = logging.getLogger(__name__) _ = gpodder.gettext N_ = gpodder.ngettext from gpodder.gtkui.model import Model from gpodder.gtkui.model import PodcastListModel from gpodder.gtkui.model import EpisodeListModel from gpodder.gtkui.config import UIConfig from gpodder.gtkui.services import CoverDownloader from gpodder.gtkui.widgets import SimpleMessageArea from gpodder.gtkui.desktopfile import UserAppsReader from gpodder.gtkui.draw import draw_text_box_centered, draw_cake_pixbuf from gpodder.gtkui.draw import EPISODE_LIST_ICON_SIZE from gpodder.gtkui.interface.common import BuilderWidget from gpodder.gtkui.interface.common import TreeViewHelper from gpodder.gtkui.interface.addpodcast import gPodderAddPodcast from gpodder.gtkui.download import DownloadStatusModel from gpodder.gtkui.desktop.welcome import gPodderWelcome from gpodder.gtkui.desktop.channel import gPodderChannel from gpodder.gtkui.desktop.preferences import gPodderPreferences from gpodder.gtkui.desktop.episodeselector import gPodderEpisodeSelector from gpodder.gtkui.desktop.podcastdirectory import gPodderPodcastDirectory from gpodder.gtkui.interface.progress import ProgressIndicator from gpodder.gtkui.desktop.sync import gPodderSyncUI from gpodder.gtkui import flattr from gpodder.gtkui import shownotes from gpodder.dbusproxy import DBusPodcastsProxy from gpodder import extensions macapp = None if gpodder.ui.osx and getattr(gtk.gdk, 'WINDOWING', 'x11') == 'quartz': try: from gtkosx_application import * macapp = Application() except ImportError: print >> sys.stderr, """ Warning: gtk-mac-integration not found, disabling native menus """ class gPodder(BuilderWidget, dbus.service.Object): # Width (in pixels) of episode list icon EPISODE_LIST_ICON_WIDTH = 40 def __init__(self, bus_name, gpodder_core): dbus.service.Object.__init__(self, object_path=gpodder.dbus_gui_object_path, bus_name=bus_name) self.podcasts_proxy = DBusPodcastsProxy(lambda: self.channels, self.on_itemUpdate_activate, self.playback_episodes, self.download_episode_list, self.episode_object_by_uri, bus_name) self.core = gpodder_core self.config = self.core.config self.db = self.core.db self.model = self.core.model self.flattr = self.core.flattr BuilderWidget.__init__(self, None) def new(self): gpodder.user_extensions.on_ui_object_available('gpodder-gtk', self) self.toolbar.set_property('visible', self.config.show_toolbar) self.bluetooth_available = util.bluetooth_available() self.config.connect_gtk_window(self.main_window, 'main_window') self.config.connect_gtk_paned('ui.gtk.state.main_window.paned_position', self.channelPaned) self.main_window.show() self.player_receiver = player.MediaPlayerDBusReceiver(self.on_played) self.gPodder.connect('key-press-event', self.on_key_press) self.episode_columns_menu = None self.config.add_observer(self.on_config_changed) self.sw_shownotes = gtk.ScrolledWindow() self.sw_shownotes.set_shadow_type(gtk.SHADOW_IN) self.sw_shownotes.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) # Vertical paned for the episode list and shownotes self.vpaned = gtk.VPaned() paned = self.vbox_episode_list.get_parent() self.vbox_episode_list.reparent(self.vpaned) self.vpaned.child_set_property(self.vbox_episode_list, 'resize', True) self.vpaned.child_set_property(self.vbox_episode_list, 'shrink', False) self.vpaned.pack2(self.sw_shownotes, resize=False, shrink=False) self.vpaned.show() # Minimum height for both episode list and shownotes self.vbox_episode_list.set_size_request(-1, 100) self.sw_shownotes.set_size_request(-1, 100) self.config.connect_gtk_paned('ui.gtk.state.main_window.episode_list_size', self.vpaned) paned.add2(self.vpaned) if self.config.enable_html_shownotes and shownotes.have_webkit: self.shownotes_object = shownotes.gPodderShownotesHTML(self.sw_shownotes) else: self.shownotes_object = shownotes.gPodderShownotesText(self.sw_shownotes) self.sw_shownotes.hide() self.new_episodes_window = None # Mac OS X-specific UI tweaks: Native main menu integration # http://sourceforge.net/apps/trac/gtk-osx/wiki/Integrate if macapp is not None: # Move the menu bar from the window to the Mac menu bar self.mainMenu.hide() macapp.set_menu_bar(self.mainMenu) # Reparent some items to the "Application" menu item = self.uimanager1.get_widget('/mainMenu/menuHelp/itemAbout') macapp.insert_app_menu_item(item, 0) macapp.insert_app_menu_item(gtk.SeparatorMenuItem(), 1) item = self.uimanager1.get_widget('/mainMenu/menuPodcasts/itemPreferences') macapp.insert_app_menu_item(item, 2) quit_item = self.uimanager1.get_widget('/mainMenu/menuPodcasts/itemQuit') quit_item.hide() # end Mac OS X specific UI tweaks self.download_status_model = DownloadStatusModel() self.download_queue_manager = download.DownloadQueueManager(self.config) self.itemShowAllEpisodes.set_active(self.config.podcast_list_view_all) self.itemShowToolbar.set_active(self.config.show_toolbar) self.itemShowDescription.set_active(self.config.episode_list_descriptions) self.config.connect_gtk_spinbutton('max_downloads', self.spinMaxDownloads) self.config.connect_gtk_togglebutton('max_downloads_enabled', self.cbMaxDownloads) self.config.connect_gtk_spinbutton('limit_rate_value', self.spinLimitDownloads) self.config.connect_gtk_togglebutton('limit_rate', self.cbLimitDownloads) self.config.connect_gtk_togglebutton('podcast_list_sections', self.item_podcast_sections) # When the amount of maximum downloads changes, notify the queue manager changed_cb = lambda spinbutton: self.download_queue_manager.spawn_threads() self.spinMaxDownloads.connect('value-changed', changed_cb) self.default_title = None self.set_title(_('gPodder')) self.cover_downloader = CoverDownloader() # Generate list models for podcasts and their episodes self.podcast_list_model = PodcastListModel(self.cover_downloader) self.cover_downloader.register('cover-available', self.cover_download_finished) # Source IDs for timeouts for search-as-you-type self._podcast_list_search_timeout = None self._episode_list_search_timeout = None # Init the treeviews that we use self.init_podcast_list_treeview() self.init_episode_list_treeview() self.init_download_list_treeview() if self.config.podcast_list_hide_boring: self.item_view_hide_boring_podcasts.set_active(True) self.currently_updating = False self.download_tasks_seen = set() self.download_list_update_enabled = False self.download_task_monitors = set() # Subscribed channels self.active_channel = None self.channels = self.model.get_podcasts() # Set up the first instance of MygPoClient self.mygpo_client = my.MygPoClient(self.config) gpodder.user_extensions.on_ui_initialized(self.model, self.extensions_podcast_update_cb, self.extensions_episode_download_cb) # load list of user applications for audio playback self.user_apps_reader = UserAppsReader(['audio', 'video']) util.run_in_background(self.user_apps_reader.read) # Now, update the feed cache, when everything's in place self.btnUpdateFeeds.show() self.feed_cache_update_cancelled = False self.update_podcast_list_model() self.message_area = None self.partial_downloads_indicator = None util.run_in_background(self.find_partial_downloads) # Start the auto-update procedure self._auto_update_timer_source_id = None if self.config.auto_update_feeds: self.restart_auto_update_timer() # Find expired (old) episodes and delete them old_episodes = list(common.get_expired_episodes(self.channels, self.config)) if len(old_episodes) > 0: self.delete_episode_list(old_episodes, confirm=False) updated_urls = set(e.channel.url for e in old_episodes) self.update_podcast_list_model(updated_urls) # Do the initial sync with the web service util.idle_add(self.mygpo_client.flush, True) # First-time users should be asked if they want to see the OPML if not self.channels: self.on_itemUpdate_activate() elif self.config.software_update.check_on_startup: # Check for software updates from gpodder.org diff = time.time() - self.config.software_update.last_check if diff > (60*60*24)*self.config.software_update.interval: self.config.software_update.last_check = int(time.time()) self.check_for_updates(silent=True) def find_partial_downloads(self): def start_progress_callback(count): self.partial_downloads_indicator = ProgressIndicator( _('Loading incomplete downloads'), _('Some episodes have not finished downloading in a previous session.'), False, self.get_dialog_parent()) self.partial_downloads_indicator.on_message(N_('%(count)d partial file', '%(count)d partial files', count) % {'count':count}) util.idle_add(self.wNotebook.set_current_page, 1) def progress_callback(title, progress): self.partial_downloads_indicator.on_message(title) self.partial_downloads_indicator.on_progress(progress) def finish_progress_callback(resumable_episodes): util.idle_add(self.partial_downloads_indicator.on_finished) self.partial_downloads_indicator = None if resumable_episodes: def offer_resuming(): self.download_episode_list_paused(resumable_episodes) resume_all = gtk.Button(_('Resume all')) def on_resume_all(button): selection = self.treeDownloads.get_selection() selection.select_all() selected_tasks, _, _, _, _, _ = self.downloads_list_get_selection() selection.unselect_all() self._for_each_task_set_status(selected_tasks, download.DownloadTask.QUEUED) self.message_area.hide() resume_all.connect('clicked', on_resume_all) self.message_area = SimpleMessageArea(_('Incomplete downloads from a previous session were found.'), (resume_all,)) self.vboxDownloadStatusWidgets.pack_start(self.message_area, expand=False) self.vboxDownloadStatusWidgets.reorder_child(self.message_area, 0) self.message_area.show_all() common.clean_up_downloads(delete_partial=False) util.idle_add(offer_resuming) else: util.idle_add(self.wNotebook.set_current_page, 0) common.find_partial_downloads(self.channels, start_progress_callback, progress_callback, finish_progress_callback) def episode_object_by_uri(self, uri): """Get an episode object given a local or remote URI This can be used to quickly access an episode object when all we have is its download filename or episode URL (e.g. from external D-Bus calls / signals, etc..) """ if uri.startswith('/'): uri = 'file://' + urllib.quote(uri) prefix = 'file://' + urllib.quote(gpodder.downloads) # By default, assume we can't pre-select any channel # but can match episodes simply via the download URL is_channel = lambda c: True is_episode = lambda e: e.url == uri if uri.startswith(prefix): # File is on the local filesystem in the download folder # Try to reduce search space by pre-selecting the channel # based on the folder name of the local file filename = urllib.unquote(uri[len(prefix):]) file_parts = filter(None, filename.split(os.sep)) if len(file_parts) != 2: return None foldername, filename = file_parts is_channel = lambda c: c.download_folder == foldername is_episode = lambda e: e.download_filename == filename # Deep search through channels and episodes for a match for channel in filter(is_channel, self.channels): for episode in filter(is_episode, channel.get_all_episodes()): return episode return None def on_played(self, start, end, total, file_uri): """Handle the "played" signal from a media player""" if start == 0 and end == 0 and total == 0: # Ignore bogus play event return elif end < start + 5: # Ignore "less than five seconds" segments, # as they can happen with seeking, etc... return logger.debug('Received play action: %s (%d, %d, %d)', file_uri, start, end, total) episode = self.episode_object_by_uri(file_uri) if episode is not None: file_type = episode.file_type() now = time.time() if total > 0: episode.total_time = total elif total == 0: # Assume the episode's total time for the action total = episode.total_time assert (episode.current_position_updated is None or now >= episode.current_position_updated) episode.current_position = end episode.current_position_updated = now episode.mark(is_played=True) episode.save() self.db.commit() self.update_episode_list_icons([episode.url]) self.update_podcast_list_model([episode.channel.url]) # Submit this action to the webservice self.mygpo_client.on_playback_full(episode, start, end, total) def on_add_remove_podcasts_mygpo(self): actions = self.mygpo_client.get_received_actions() if not actions: return False existing_urls = [c.url for c in self.channels] # Columns for the episode selector window - just one... columns = ( ('description', None, None, _('Action')), ) # A list of actions that have to be chosen from changes = [] # Actions that are ignored (already carried out) ignored = [] for action in actions: if action.is_add and action.url not in existing_urls: changes.append(my.Change(action)) elif action.is_remove and action.url in existing_urls: podcast_object = None for podcast in self.channels: if podcast.url == action.url: podcast_object = podcast break changes.append(my.Change(action, podcast_object)) else: ignored.append(action) # Confirm all ignored changes self.mygpo_client.confirm_received_actions(ignored) def execute_podcast_actions(selected): # In the future, we might retrieve the title from gpodder.net here, # but for now, we just use "None" to use the feed-provided title title = None add_list = [(title, c.action.url) for c in selected if c.action.is_add] remove_list = [c.podcast for c in selected if c.action.is_remove] # Apply the accepted changes locally self.add_podcast_list(add_list) self.remove_podcast_list(remove_list, confirm=False) # All selected items are now confirmed self.mygpo_client.confirm_received_actions(c.action for c in selected) # Revert the changes on the server rejected = [c.action for c in changes if c not in selected] self.mygpo_client.reject_received_actions(rejected) def ask(): # We're abusing the Episode Selector again ;) -- thp gPodderEpisodeSelector(self.main_window, \ title=_('Confirm changes from gpodder.net'), \ instructions=_('Select the actions you want to carry out.'), \ episodes=changes, \ columns=columns, \ size_attribute=None, \ stock_ok_button=gtk.STOCK_APPLY, \ callback=execute_podcast_actions, \ _config=self.config) # There are some actions that need the user's attention if changes: util.idle_add(ask) return True # We have no remaining actions - no selection happens return False def rewrite_urls_mygpo(self): # Check if we have to rewrite URLs since the last add rewritten_urls = self.mygpo_client.get_rewritten_urls() changed = False for rewritten_url in rewritten_urls: if not rewritten_url.new_url: continue for channel in self.channels: if channel.url == rewritten_url.old_url: logger.info('Updating URL of %s to %s', channel, rewritten_url.new_url) channel.url = rewritten_url.new_url channel.save() changed = True break if changed: util.idle_add(self.update_episode_list_model) def on_send_full_subscriptions(self): # Send the full subscription list to the gpodder.net client # (this will overwrite the subscription list on the server) indicator = ProgressIndicator(_('Uploading subscriptions'), \ _('Your subscriptions are being uploaded to the server.'), \ False, self.get_dialog_parent()) try: self.mygpo_client.set_subscriptions([c.url for c in self.channels]) util.idle_add(self.show_message, _('List uploaded successfully.')) except Exception, e: def show_error(e): message = str(e) if not message: message = e.__class__.__name__ self.show_message(message, \ _('Error while uploading'), \ important=True) util.idle_add(show_error, e) util.idle_add(indicator.on_finished) def on_button_subscribe_clicked(self, button): self.on_itemImportChannels_activate(button) def on_button_downloads_clicked(self, widget): self.downloads_window.show() def for_each_episode_set_task_status(self, episodes, status): episode_urls = set(episode.url for episode in episodes) model = self.treeDownloads.get_model() selected_tasks = [(gtk.TreeRowReference(model, row.path), \ model.get_value(row.iter, \ DownloadStatusModel.C_TASK)) for row in model \ if model.get_value(row.iter, DownloadStatusModel.C_TASK).url \ in episode_urls] self._for_each_task_set_status(selected_tasks, status) def on_treeview_button_pressed(self, treeview, event): if event.window != treeview.get_bin_window(): return False role = getattr(treeview, TreeViewHelper.ROLE) if role == TreeViewHelper.ROLE_PODCASTS: return self.currently_updating elif (role == TreeViewHelper.ROLE_EPISODES and event.button == 1): # Toggle episode "new" status by clicking the icon (bug 1432) result = treeview.get_path_at_pos(int(event.x), int(event.y)) if result is not None: path, column, x, y = result # The user clicked the icon if she clicked in the first column # and the x position is in the area where the icon resides if (x < self.EPISODE_LIST_ICON_WIDTH and column == treeview.get_columns()[0]): model = treeview.get_model() cursor_episode = model.get_value(model.get_iter(path), EpisodeListModel.C_EPISODE) new_value = cursor_episode.is_new selected_episodes = self.get_selected_episodes() # Avoid changing anything if the clicked episode is not # selected already - otherwise update all selected if cursor_episode in selected_episodes: for episode in selected_episodes: episode.mark(is_played=new_value) self.update_episode_list_icons(selected=True) self.update_podcast_list_model(selected=True) return True return event.button == 3 def on_treeview_podcasts_button_released(self, treeview, event): if event.window != treeview.get_bin_window(): return False return self.treeview_channels_show_context_menu(treeview, event) def on_treeview_episodes_button_released(self, treeview, event): if event.window != treeview.get_bin_window(): return False return self.treeview_available_show_context_menu(treeview, event) def on_treeview_downloads_button_released(self, treeview, event): if event.window != treeview.get_bin_window(): return False return self.treeview_downloads_show_context_menu(treeview, event) def on_entry_search_podcasts_changed(self, editable): if self.hbox_search_podcasts.get_property('visible'): def set_search_term(self, text): self.podcast_list_model.set_search_term(text) self._podcast_list_search_timeout = None return False if self._podcast_list_search_timeout is not None: gobject.source_remove(self._podcast_list_search_timeout) self._podcast_list_search_timeout = gobject.timeout_add( self.config.ui.gtk.live_search_delay, set_search_term, self, editable.get_chars(0, -1)) def on_entry_search_podcasts_key_press(self, editable, event): if event.keyval == gtk.keysyms.Escape: self.hide_podcast_search() return True def hide_podcast_search(self, *args): if self._podcast_list_search_timeout is not None: gobject.source_remove(self._podcast_list_search_timeout) self._podcast_list_search_timeout = None self.hbox_search_podcasts.hide() self.entry_search_podcasts.set_text('') self.podcast_list_model.set_search_term(None) self.treeChannels.grab_focus() def show_podcast_search(self, input_char): self.hbox_search_podcasts.show() self.entry_search_podcasts.insert_text(input_char, -1) self.entry_search_podcasts.grab_focus() self.entry_search_podcasts.set_position(-1) def init_podcast_list_treeview(self): # Set up podcast channel tree view widget column = gtk.TreeViewColumn('') iconcell = gtk.CellRendererPixbuf() iconcell.set_property('width', 45) column.pack_start(iconcell, False) column.add_attribute(iconcell, 'pixbuf', PodcastListModel.C_COVER) column.add_attribute(iconcell, 'visible', PodcastListModel.C_COVER_VISIBLE) namecell = gtk.CellRendererText() namecell.set_property('ellipsize', pango.ELLIPSIZE_END) column.pack_start(namecell, True) column.add_attribute(namecell, 'markup', PodcastListModel.C_DESCRIPTION) iconcell = gtk.CellRendererPixbuf() iconcell.set_property('xalign', 1.0) column.pack_start(iconcell, False) column.add_attribute(iconcell, 'pixbuf', PodcastListModel.C_PILL) column.add_attribute(iconcell, 'visible', PodcastListModel.C_PILL_VISIBLE) self.treeChannels.append_column(column) self.treeChannels.set_model(self.podcast_list_model.get_filtered_model()) # When no podcast is selected, clear the episode list model selection = self.treeChannels.get_selection() def select_function(selection, model, path, path_currently_selected): url = model.get_value(model.get_iter(path), PodcastListModel.C_URL) return (url != '-') selection.set_select_function(select_function, full=True) # Set up type-ahead find for the podcast list def on_key_press(treeview, event): if event.keyval == gtk.keysyms.Right: self.treeAvailable.grab_focus() elif event.keyval in (gtk.keysyms.Up, gtk.keysyms.Down): # If section markers exist in the treeview, we want to # "jump over" them when moving the cursor up and down selection = self.treeChannels.get_selection() model, it = selection.get_selected() if event.keyval == gtk.keysyms.Up: step = -1 else: step = 1 path = model.get_path(it) while True: path = (path[0]+step,) if path[0] < 0: # Valid paths must have a value >= 0 return True try: it = model.get_iter(path) except ValueError: # Already at the end of the list return True if model.get_value(it, PodcastListModel.C_URL) != '-': break self.treeChannels.set_cursor(path) elif event.keyval == gtk.keysyms.Escape: self.hide_podcast_search() elif event.state & gtk.gdk.CONTROL_MASK: # Don't handle type-ahead when control is pressed (so shortcuts # with the Ctrl key still work, e.g. Ctrl+A, ...) return True else: unicode_char_id = gtk.gdk.keyval_to_unicode(event.keyval) if unicode_char_id == 0: return False input_char = unichr(unicode_char_id) self.show_podcast_search(input_char) return True self.treeChannels.connect('key-press-event', on_key_press) self.treeChannels.connect('popup-menu', self.treeview_channels_show_context_menu) # Enable separators to the podcast list to separate special podcasts # from others (this is used for the "all episodes" view) self.treeChannels.set_row_separator_func(PodcastListModel.row_separator_func) TreeViewHelper.set(self.treeChannels, TreeViewHelper.ROLE_PODCASTS) def on_entry_search_episodes_changed(self, editable): if self.hbox_search_episodes.get_property('visible'): def set_search_term(self, text): self.episode_list_model.set_search_term(text) self._episode_list_search_timeout = None return False if self._episode_list_search_timeout is not None: gobject.source_remove(self._episode_list_search_timeout) self._episode_list_search_timeout = gobject.timeout_add( self.config.ui.gtk.live_search_delay, set_search_term, self, editable.get_chars(0, -1)) def on_entry_search_episodes_key_press(self, editable, event): if event.keyval == gtk.keysyms.Escape: self.hide_episode_search() return True def hide_episode_search(self, *args): if self._episode_list_search_timeout is not None: gobject.source_remove(self._episode_list_search_timeout) self._episode_list_search_timeout = None self.hbox_search_episodes.hide() self.entry_search_episodes.set_text('') self.episode_list_model.set_search_term(None) self.treeAvailable.grab_focus() def show_episode_search(self, input_char): self.hbox_search_episodes.show() self.entry_search_episodes.insert_text(input_char, -1) self.entry_search_episodes.grab_focus() self.entry_search_episodes.set_position(-1) def set_episode_list_column(self, index, new_value): mask = (1 << index) if new_value: self.config.episode_list_columns |= mask else: self.config.episode_list_columns &= ~mask def update_episode_list_columns_visibility(self): columns = TreeViewHelper.get_columns(self.treeAvailable) for index, column in enumerate(columns): visible = bool(self.config.episode_list_columns & (1 << index)) column.set_visible(visible) self.treeAvailable.columns_autosize() if self.episode_columns_menu is not None: children = self.episode_columns_menu.get_children() for index, child in enumerate(children): active = bool(self.config.episode_list_columns & (1 << index)) child.set_active(active) def on_episode_list_header_clicked(self, button, event): if event.button != 3: return False if self.episode_columns_menu is not None: self.episode_columns_menu.popup(None, None, None, event.button, \ event.time, None) return False def init_episode_list_treeview(self): # For loading the list model self.episode_list_model = EpisodeListModel(self.config, self.on_episode_list_filter_changed) if self.config.episode_list_view_mode == EpisodeListModel.VIEW_UNDELETED: self.item_view_episodes_undeleted.set_active(True) elif self.config.episode_list_view_mode == EpisodeListModel.VIEW_DOWNLOADED: self.item_view_episodes_downloaded.set_active(True) elif self.config.episode_list_view_mode == EpisodeListModel.VIEW_UNPLAYED: self.item_view_episodes_unplayed.set_active(True) else: self.item_view_episodes_all.set_active(True) self.episode_list_model.set_view_mode(self.config.episode_list_view_mode) self.treeAvailable.set_model(self.episode_list_model.get_filtered_model()) TreeViewHelper.set(self.treeAvailable, TreeViewHelper.ROLE_EPISODES) iconcell = gtk.CellRendererPixbuf() episode_list_icon_size = gtk.icon_size_register('episode-list', EPISODE_LIST_ICON_SIZE, EPISODE_LIST_ICON_SIZE) iconcell.set_property('stock-size', episode_list_icon_size) iconcell.set_fixed_size(self.EPISODE_LIST_ICON_WIDTH, -1) namecell = gtk.CellRendererText() namecell.set_property('ellipsize', pango.ELLIPSIZE_END) namecolumn = gtk.TreeViewColumn(_('Episode')) namecolumn.pack_start(iconcell, False) namecolumn.add_attribute(iconcell, 'icon-name', EpisodeListModel.C_STATUS_ICON) namecolumn.pack_start(namecell, True) namecolumn.add_attribute(namecell, 'markup', EpisodeListModel.C_DESCRIPTION) namecolumn.set_sort_column_id(EpisodeListModel.C_DESCRIPTION) namecolumn.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) namecolumn.set_resizable(True) namecolumn.set_expand(True) lockcell = gtk.CellRendererPixbuf() lockcell.set_fixed_size(40, -1) lockcell.set_property('stock-size', gtk.ICON_SIZE_MENU) lockcell.set_property('icon-name', 'emblem-readonly') namecolumn.pack_start(lockcell, False) namecolumn.add_attribute(lockcell, 'visible', EpisodeListModel.C_LOCKED) sizecell = gtk.CellRendererText() sizecell.set_property('xalign', 1) sizecolumn = gtk.TreeViewColumn(_('Size'), sizecell, text=EpisodeListModel.C_FILESIZE_TEXT) sizecolumn.set_sort_column_id(EpisodeListModel.C_FILESIZE) timecell = gtk.CellRendererText() timecell.set_property('xalign', 1) timecolumn = gtk.TreeViewColumn(_('Duration'), timecell, text=EpisodeListModel.C_TIME) timecolumn.set_sort_column_id(EpisodeListModel.C_TOTAL_TIME) releasecell = gtk.CellRendererText() releasecolumn = gtk.TreeViewColumn(_('Released'), releasecell, text=EpisodeListModel.C_PUBLISHED_TEXT) releasecolumn.set_sort_column_id(EpisodeListModel.C_PUBLISHED) namecolumn.set_reorderable(True) self.treeAvailable.append_column(namecolumn) for itemcolumn in (sizecolumn, timecolumn, releasecolumn): itemcolumn.set_reorderable(True) self.treeAvailable.append_column(itemcolumn) TreeViewHelper.register_column(self.treeAvailable, itemcolumn) # Add context menu to all tree view column headers for column in self.treeAvailable.get_columns(): label = gtk.Label(column.get_title()) label.show_all() column.set_widget(label) w = column.get_widget() while w is not None and not isinstance(w, gtk.Button): w = w.get_parent() w.connect('button-release-event', self.on_episode_list_header_clicked) # Create a new menu for the visible episode list columns for child in self.mainMenu.get_children(): if child.get_name() == 'menuView': submenu = child.get_submenu() item = gtk.MenuItem(_('Visible columns')) submenu.append(gtk.SeparatorMenuItem()) submenu.append(item) submenu.show_all() self.episode_columns_menu = gtk.Menu() item.set_submenu(self.episode_columns_menu) break # For each column that can be shown/hidden, add a menu item columns = TreeViewHelper.get_columns(self.treeAvailable) for index, column in enumerate(columns): item = gtk.CheckMenuItem(column.get_title()) self.episode_columns_menu.append(item) def on_item_toggled(item, index): self.set_episode_list_column(index, item.get_active()) item.connect('toggled', on_item_toggled, index) self.episode_columns_menu.show_all() # Update the visibility of the columns and the check menu items self.update_episode_list_columns_visibility() # Set up type-ahead find for the episode list def on_key_press(treeview, event): if event.keyval == gtk.keysyms.Left: self.treeChannels.grab_focus() elif event.keyval == gtk.keysyms.Escape: if self.hbox_search_episodes.get_property('visible'): self.hide_episode_search() else: self.sw_shownotes.hide() elif event.state & gtk.gdk.CONTROL_MASK: # Don't handle type-ahead when control is pressed (so shortcuts # with the Ctrl key still work, e.g. Ctrl+A, ...) return False else: unicode_char_id = gtk.gdk.keyval_to_unicode(event.keyval) if unicode_char_id == 0: return False input_char = unichr(unicode_char_id) self.show_episode_search(input_char) return True self.treeAvailable.connect('key-press-event', on_key_press) self.treeAvailable.connect('popup-menu', self.treeview_available_show_context_menu) self.treeAvailable.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, \ (('text/uri-list', 0, 0),), gtk.gdk.ACTION_COPY) def drag_data_get(tree, context, selection_data, info, timestamp): uris = ['file://'+e.local_filename(create=False) \ for e in self.get_selected_episodes() \ if e.was_downloaded(and_exists=True)] uris.append('') # for the trailing '\r\n' selection_data.set(selection_data.target, 8, '\r\n'.join(uris)) self.treeAvailable.connect('drag-data-get', drag_data_get) selection = self.treeAvailable.get_selection() selection.set_mode(gtk.SELECTION_MULTIPLE) selection.connect('changed', self.on_episode_list_selection_changed) def on_episode_list_selection_changed(self, selection): # Update the toolbar buttons self.play_or_download() rows = selection.count_selected_rows() if rows != 1: self.shownotes_object.set_episode(None) elif self.sw_shownotes.get_property('visible'): episode = self.get_selected_episodes()[0] self.shownotes_object.set_episode(episode) def init_download_list_treeview(self): # enable multiple selection support self.treeDownloads.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.treeDownloads.set_search_equal_func(TreeViewHelper.make_search_equal_func(DownloadStatusModel)) # columns and renderers for "download progress" tab # First column: [ICON] Episodename column = gtk.TreeViewColumn(_('Episode')) cell = gtk.CellRendererPixbuf() cell.set_property('stock-size', gtk.ICON_SIZE_BUTTON) column.pack_start(cell, expand=False) column.add_attribute(cell, 'icon-name', \ DownloadStatusModel.C_ICON_NAME) cell = gtk.CellRendererText() cell.set_property('ellipsize', pango.ELLIPSIZE_END) column.pack_start(cell, expand=True) column.add_attribute(cell, 'markup', DownloadStatusModel.C_NAME) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) column.set_expand(True) self.treeDownloads.append_column(column) # Second column: Progress cell = gtk.CellRendererProgress() cell.set_property('yalign', .5) cell.set_property('ypad', 6) column = gtk.TreeViewColumn(_('Progress'), cell, value=DownloadStatusModel.C_PROGRESS, \ text=DownloadStatusModel.C_PROGRESS_TEXT) column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) column.set_expand(False) self.treeDownloads.append_column(column) column.set_property('min-width', 150) column.set_property('max-width', 150) self.treeDownloads.set_model(self.download_status_model) TreeViewHelper.set(self.treeDownloads, TreeViewHelper.ROLE_DOWNLOADS) self.treeDownloads.connect('popup-menu', self.treeview_downloads_show_context_menu) def on_treeview_expose_event(self, treeview, event): if event.window == treeview.get_bin_window(): model = treeview.get_model() if (model is not None and model.get_iter_first() is not None): return False role = getattr(treeview, TreeViewHelper.ROLE, None) if role is None: return False ctx = event.window.cairo_create() ctx.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) ctx.clip() x, y, width, height, depth = event.window.get_geometry() progress = None if role == TreeViewHelper.ROLE_EPISODES: if self.currently_updating: text = _('Loading episodes') elif self.config.episode_list_view_mode != \ EpisodeListModel.VIEW_ALL: text = _('No episodes in current view') else: text = _('No episodes available') elif role == TreeViewHelper.ROLE_PODCASTS: if self.config.episode_list_view_mode != \ EpisodeListModel.VIEW_ALL and \ self.config.podcast_list_hide_boring and \ len(self.channels) > 0: text = _('No podcasts in this view') else: text = _('No subscriptions') elif role == TreeViewHelper.ROLE_DOWNLOADS: text = _('No active tasks') else: raise Exception('on_treeview_expose_event: unknown role') font_desc = None draw_text_box_centered(ctx, treeview, width, height, text, font_desc, progress) return False def enable_download_list_update(self): if not self.download_list_update_enabled: self.update_downloads_list() gobject.timeout_add(1500, self.update_downloads_list) self.download_list_update_enabled = True def cleanup_downloads(self): model = self.download_status_model all_tasks = [(gtk.TreeRowReference(model, row.path), row[0]) for row in model] changed_episode_urls = set() for row_reference, task in all_tasks: if task.status in (task.DONE, task.CANCELLED): model.remove(model.get_iter(row_reference.get_path())) try: # We don't "see" this task anymore - remove it; # this is needed, so update_episode_list_icons() # below gets the correct list of "seen" tasks self.download_tasks_seen.remove(task) except KeyError, key_error: pass changed_episode_urls.add(task.url) # Tell the task that it has been removed (so it can clean up) task.removed_from_list() # Tell the podcasts tab to update icons for our removed podcasts self.update_episode_list_icons(changed_episode_urls) # Update the downloads list one more time self.update_downloads_list(can_call_cleanup=False) def on_tool_downloads_toggled(self, toolbutton): if toolbutton.get_active(): self.wNotebook.set_current_page(1) else: self.wNotebook.set_current_page(0) def add_download_task_monitor(self, monitor): self.download_task_monitors.add(monitor) model = self.download_status_model if model is None: model = () for row in model: task = row[self.download_status_model.C_TASK] monitor.task_updated(task) def remove_download_task_monitor(self, monitor): self.download_task_monitors.remove(monitor) def set_download_progress(self, progress): gpodder.user_extensions.on_download_progress(progress) def update_downloads_list(self, can_call_cleanup=True): try: model = self.download_status_model downloading, synchronizing, failed, finished, queued, paused, others = 0, 0, 0, 0, 0, 0, 0 total_speed, total_size, done_size = 0, 0, 0 # Keep a list of all download tasks that we've seen download_tasks_seen = set() # Do not go through the list of the model is not (yet) available if model is None: model = () for row in model: self.download_status_model.request_update(row.iter) task = row[self.download_status_model.C_TASK] speed, size, status, progress, activity = task.speed, task.total_size, task.status, task.progress, task.activity # Let the download task monitors know of changes for monitor in self.download_task_monitors: monitor.task_updated(task) total_size += size done_size += size*progress download_tasks_seen.add(task) if (status == download.DownloadTask.DOWNLOADING and activity == download.DownloadTask.ACTIVITY_DOWNLOAD): downloading += 1 total_speed += speed elif (status == download.DownloadTask.DOWNLOADING and activity == download.DownloadTask.ACTIVITY_SYNCHRONIZE): synchronizing += 1 elif status == download.DownloadTask.FAILED: failed += 1 elif status == download.DownloadTask.DONE: finished += 1 elif status == download.DownloadTask.QUEUED: queued += 1 elif status == download.DownloadTask.PAUSED: paused += 1 else: others += 1 # Remember which tasks we have seen after this run self.download_tasks_seen = download_tasks_seen text = [_('Progress')] if downloading + failed + queued + synchronizing > 0: s = [] if downloading > 0: s.append(N_('%(count)d active', '%(count)d active', downloading) % {'count':downloading}) if synchronizing > 0: s.append(N_('%(count)d active', '%(count)d active', synchronizing) % {'count':synchronizing}) if failed > 0: s.append(N_('%(count)d failed', '%(count)d failed', failed) % {'count':failed}) if queued > 0: s.append(N_('%(count)d queued', '%(count)d queued', queued) % {'count':queued}) text.append(' (' + ', '.join(s)+')') self.labelDownloads.set_text(''.join(text)) title = [self.default_title] # Accessing task.status_changed has the side effect of re-setting # the changed flag, but we only do it once here so that's okay channel_urls = [task.podcast_url for task in self.download_tasks_seen if task.status_changed] episode_urls = [task.url for task in self.download_tasks_seen] if downloading > 0: title.append(N_('downloading %(count)d file', 'downloading %(count)d files', downloading) % {'count':downloading}) if total_size > 0: percentage = 100.0*done_size/total_size else: percentage = 0.0 self.set_download_progress(percentage/100.) total_speed = util.format_filesize(total_speed) title[1] += ' (%d%%, %s/s)' % (percentage, total_speed) if synchronizing > 0: title.append(N_('synchronizing %(count)d file', 'synchronizing %(count)d files', synchronizing) % {'count':synchronizing}) if queued > 0: title.append(N_('%(queued)d task queued', '%(queued)d tasks queued', queued) % {'queued':queued}) if (downloading + synchronizing + queued)==0: self.set_download_progress(1.) self.downloads_finished(self.download_tasks_seen) gpodder.user_extensions.on_all_episodes_downloaded() logger.info('All tasks have finished.') # Remove finished episodes if self.config.auto_cleanup_downloads and can_call_cleanup: self.cleanup_downloads() # Stop updating the download list here self.download_list_update_enabled = False self.gPodder.set_title(' - '.join(title)) self.update_episode_list_icons(episode_urls) self.play_or_download() if channel_urls: self.update_podcast_list_model(channel_urls) return self.download_list_update_enabled except Exception, e: logger.error('Exception happened while updating download list.', exc_info=True) self.show_message('%s\n\n%s' % (_('Please report this problem and restart gPodder:'), str(e)), _('Unhandled exception'), important=True) # We return False here, so the update loop won't be called again, # that's why we require the restart of gPodder in the message. return False def on_config_changed(self, *args): util.idle_add(self._on_config_changed, *args) def _on_config_changed(self, name, old_value, new_value): if name == 'ui.gtk.toolbar': self.toolbar.set_property('visible', new_value) elif name == 'ui.gtk.episode_list.descriptions': self.update_episode_list_model() elif name in ('auto.update.enabled', 'auto.update.frequency'): self.restart_auto_update_timer() elif name in ('ui.gtk.podcast_list.all_episodes', 'ui.gtk.podcast_list.sections'): # Force a update of the podcast list model self.update_podcast_list_model() elif name == 'ui.gtk.episode_list.columns': self.update_episode_list_columns_visibility() def on_treeview_query_tooltip(self, treeview, x, y, keyboard_tooltip, tooltip): # With get_bin_window, we get the window that contains the rows without # the header. The Y coordinate of this window will be the height of the # treeview header. This is the amount we have to subtract from the # event's Y coordinate to get the coordinate to pass to get_path_at_pos (x_bin, y_bin) = treeview.get_bin_window().get_position() y -= x_bin y -= y_bin (path, column, rx, ry) = treeview.get_path_at_pos( x, y) or (None,)*4 if not getattr(treeview, TreeViewHelper.CAN_TOOLTIP) or x > 50 or (column is not None and column != treeview.get_columns()[0]): setattr(treeview, TreeViewHelper.LAST_TOOLTIP, None) return False if path is not None: model = treeview.get_model() iter = model.get_iter(path) role = getattr(treeview, TreeViewHelper.ROLE) if role == TreeViewHelper.ROLE_EPISODES: id = model.get_value(iter, EpisodeListModel.C_URL) elif role == TreeViewHelper.ROLE_PODCASTS: id = model.get_value(iter, PodcastListModel.C_URL) if id == '-': # Section header - no tooltip here (for now at least) return False last_tooltip = getattr(treeview, TreeViewHelper.LAST_TOOLTIP) if last_tooltip is not None and last_tooltip != id: setattr(treeview, TreeViewHelper.LAST_TOOLTIP, None) return False setattr(treeview, TreeViewHelper.LAST_TOOLTIP, id) if role == TreeViewHelper.ROLE_EPISODES: description = model.get_value(iter, EpisodeListModel.C_TOOLTIP) if description: tooltip.set_text(description) else: return False elif role == TreeViewHelper.ROLE_PODCASTS: channel = model.get_value(iter, PodcastListModel.C_CHANNEL) if channel is None or not hasattr(channel, 'title'): return False error_str = model.get_value(iter, PodcastListModel.C_ERROR) if error_str: error_str = _('Feedparser error: %s') % cgi.escape(error_str.strip()) error_str = '%s' % error_str table = gtk.Table(rows=3, columns=3) table.set_row_spacings(5) table.set_col_spacings(5) table.set_border_width(5) heading = gtk.Label() heading.set_alignment(0, 1) heading.set_markup('%s\n%s' % (cgi.escape(channel.title), cgi.escape(channel.url))) table.attach(heading, 0, 1, 0, 1) table.attach(gtk.HSeparator(), 0, 3, 1, 2) if len(channel.description) < 500: description = channel.description else: pos = channel.description.find('\n\n') if pos == -1 or pos > 500: description = channel.description[:498]+'[...]' else: description = channel.description[:pos] description = gtk.Label(description) if error_str: description.set_markup(error_str) description.set_alignment(0, 0) description.set_line_wrap(True) table.attach(description, 0, 3, 2, 3) table.show_all() tooltip.set_custom(table) return True setattr(treeview, TreeViewHelper.LAST_TOOLTIP, None) return False def treeview_allow_tooltips(self, treeview, allow): setattr(treeview, TreeViewHelper.CAN_TOOLTIP, allow) def treeview_handle_context_menu_click(self, treeview, event): if event is None: selection = treeview.get_selection() return selection.get_selected_rows() x, y = int(event.x), int(event.y) path, column, rx, ry = treeview.get_path_at_pos(x, y) or (None,)*4 selection = treeview.get_selection() model, paths = selection.get_selected_rows() if path is None or (path not in paths and \ event.button == 3): # We have right-clicked, but not into the selection, # assume we don't want to operate on the selection paths = [] if path is not None and not paths and \ event.button == 3: # No selection or clicked outside selection; # select the single item where we clicked treeview.grab_focus() treeview.set_cursor(path, column, 0) paths = [path] if not paths: # Unselect any remaining items (clicked elsewhere) if hasattr(treeview, 'is_rubber_banding_active'): if not treeview.is_rubber_banding_active(): selection.unselect_all() else: selection.unselect_all() return model, paths def downloads_list_get_selection(self, model=None, paths=None): if model is None and paths is None: selection = self.treeDownloads.get_selection() model, paths = selection.get_selected_rows() can_queue, can_cancel, can_pause, can_remove, can_force = (True,)*5 selected_tasks = [(gtk.TreeRowReference(model, path), \ model.get_value(model.get_iter(path), \ DownloadStatusModel.C_TASK)) for path in paths] for row_reference, task in selected_tasks: if task.status != download.DownloadTask.QUEUED: can_force = False if task.status not in (download.DownloadTask.PAUSED, \ download.DownloadTask.FAILED, \ download.DownloadTask.CANCELLED): can_queue = False if task.status not in (download.DownloadTask.PAUSED, \ download.DownloadTask.QUEUED, \ download.DownloadTask.DOWNLOADING, \ download.DownloadTask.FAILED): can_cancel = False if task.status not in (download.DownloadTask.QUEUED, \ download.DownloadTask.DOWNLOADING): can_pause = False if task.status not in (download.DownloadTask.CANCELLED, \ download.DownloadTask.FAILED, \ download.DownloadTask.DONE): can_remove = False return selected_tasks, can_queue, can_cancel, can_pause, can_remove, can_force def downloads_finished(self, download_tasks_seen): # Separate tasks into downloads & syncs # Since calling notify_as_finished or notify_as_failed clears the flag, # need to iterate through downloads & syncs separately, else all sync # tasks will have their flags cleared if we do downloads first def filter_by_activity(activity, tasks): return filter(lambda task: task.activity == activity, tasks) download_tasks = filter_by_activity(download.DownloadTask.ACTIVITY_DOWNLOAD, download_tasks_seen) finished_downloads = [str(task) for task in download_tasks if task.notify_as_finished()] failed_downloads = ['%s (%s)' % (str(task), task.error_message) for task in download_tasks if task.notify_as_failed()] sync_tasks = filter_by_activity(download.DownloadTask.ACTIVITY_SYNCHRONIZE, download_tasks_seen) finished_syncs = [task for task in sync_tasks if task.notify_as_finished()] failed_syncs = [task for task in sync_tasks if task.notify_as_failed()] # Note that 'finished_ / failed_downloads' is a list of strings # Whereas 'finished_ / failed_syncs' is a list of SyncTask objects if finished_downloads and failed_downloads: message = self.format_episode_list(finished_downloads, 5) message += '\n\n%s\n' % _('Could not download some episodes:') message += self.format_episode_list(failed_downloads, 5) self.show_message(message, _('Downloads finished'), widget=self.labelDownloads) elif finished_downloads: message = self.format_episode_list(finished_downloads) self.show_message(message, _('Downloads finished'), widget=self.labelDownloads) elif failed_downloads: message = self.format_episode_list(failed_downloads) self.show_message(message, _('Downloads failed'), widget=self.labelDownloads) if finished_syncs and failed_syncs: message = self.format_episode_list(map((lambda task: str(task)),finished_syncs), 5) message += '\n\n%s\n' % _('Could not sync some episodes:') message += self.format_episode_list(map((lambda task: str(task)),failed_syncs), 5) self.show_message(message, _('Device synchronization finished'), True, widget=self.labelDownloads) elif finished_syncs: message = self.format_episode_list(map((lambda task: str(task)),finished_syncs)) self.show_message(message, _('Device synchronization finished'), widget=self.labelDownloads) elif failed_syncs: message = self.format_episode_list(map((lambda task: str(task)),failed_syncs)) self.show_message(message, _('Device synchronization failed'), True, widget=self.labelDownloads) # Do post-sync processing if required for task in finished_syncs + failed_syncs: if self.config.device_sync.after_sync.mark_episodes_played: logger.info('Marking as played on transfer: %s', task.episode.url) task.episode.mark(is_played=True) if self.config.device_sync.after_sync.delete_episodes: logger.info('Removing episode after transfer: %s', task.episode.url) task.episode.delete_from_disk() self.sync_ui.device.close() # Update icon list to show changes, if any self.update_episode_list_icons(all=True) def format_episode_list(self, episode_list, max_episodes=10): """ Format a list of episode names for notifications Will truncate long episode names and limit the amount of episodes displayed (max_episodes=10). The episode_list parameter should be a list of strings. """ MAX_TITLE_LENGTH = 100 result = [] for title in episode_list[:min(len(episode_list), max_episodes)]: # Bug 1834: make sure title is a unicode string, # so it may be cut correctly on UTF-8 char boundaries title = util.convert_bytes(title) if len(title) > MAX_TITLE_LENGTH: middle = (MAX_TITLE_LENGTH/2)-2 title = '%s...%s' % (title[0:middle], title[-middle:]) result.append(cgi.escape(title)) result.append('\n') more_episodes = len(episode_list) - max_episodes if more_episodes > 0: result.append('(...') result.append(N_('%(count)d more episode', '%(count)d more episodes', more_episodes) % {'count':more_episodes}) result.append('...)') return (''.join(result)).strip() def _for_each_task_set_status(self, tasks, status, force_start=False): episode_urls = set() model = self.treeDownloads.get_model() for row_reference, task in tasks: if status == download.DownloadTask.QUEUED: # Only queue task when its paused/failed/cancelled (or forced) if task.status in (task.PAUSED, task.FAILED, task.CANCELLED) or force_start: self.download_queue_manager.add_task(task, force_start) self.enable_download_list_update() elif status == download.DownloadTask.CANCELLED: # Cancelling a download allowed when downloading/queued if task.status in (task.QUEUED, task.DOWNLOADING): task.status = status # Cancelling paused/failed downloads requires a call to .run() elif task.status in (task.PAUSED, task.FAILED): task.status = status # Call run, so the partial file gets deleted task.run() elif status == download.DownloadTask.PAUSED: # Pausing a download only when queued/downloading if task.status in (task.DOWNLOADING, task.QUEUED): task.status = status elif status is None: # Remove the selected task - cancel downloading/queued tasks if task.status in (task.QUEUED, task.DOWNLOADING): task.status = task.CANCELLED model.remove(model.get_iter(row_reference.get_path())) # Remember the URL, so we can tell the UI to update try: # We don't "see" this task anymore - remove it; # this is needed, so update_episode_list_icons() # below gets the correct list of "seen" tasks self.download_tasks_seen.remove(task) except KeyError, key_error: pass episode_urls.add(task.url) # Tell the task that it has been removed (so it can clean up) task.removed_from_list() else: # We can (hopefully) simply set the task status here task.status = status # Tell the podcasts tab to update icons for our removed podcasts self.update_episode_list_icons(episode_urls) # Update the tab title and downloads list self.update_downloads_list() def treeview_downloads_show_context_menu(self, treeview, event=None): model, paths = self.treeview_handle_context_menu_click(treeview, event) if not paths: if not hasattr(treeview, 'is_rubber_banding_active'): return True else: return not treeview.is_rubber_banding_active() if event is None or event.button == 3: selected_tasks, can_queue, can_cancel, can_pause, can_remove, can_force = \ self.downloads_list_get_selection(model, paths) def make_menu_item(label, stock_id, tasks, status, sensitive, force_start=False): # This creates a menu item for selection-wide actions item = gtk.ImageMenuItem(label) item.set_image(gtk.image_new_from_stock(stock_id, gtk.ICON_SIZE_MENU)) item.connect('activate', lambda item: self._for_each_task_set_status(tasks, status, force_start)) item.set_sensitive(sensitive) return item menu = gtk.Menu() item = gtk.ImageMenuItem(_('Episode details')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU)) if len(selected_tasks) == 1: row_reference, task = selected_tasks[0] episode = task.episode item.connect('activate', lambda item: self.show_episode_shownotes(episode)) else: item.set_sensitive(False) menu.append(item) menu.append(gtk.SeparatorMenuItem()) if can_force: menu.append(make_menu_item(_('Start download now'), gtk.STOCK_GO_DOWN, selected_tasks, download.DownloadTask.QUEUED, True, True)) else: menu.append(make_menu_item(_('Download'), gtk.STOCK_GO_DOWN, selected_tasks, download.DownloadTask.QUEUED, can_queue, False)) menu.append(make_menu_item(_('Cancel'), gtk.STOCK_CANCEL, selected_tasks, download.DownloadTask.CANCELLED, can_cancel)) menu.append(make_menu_item(_('Pause'), gtk.STOCK_MEDIA_PAUSE, selected_tasks, download.DownloadTask.PAUSED, can_pause)) menu.append(gtk.SeparatorMenuItem()) menu.append(make_menu_item(_('Remove from list'), gtk.STOCK_REMOVE, selected_tasks, None, can_remove)) menu.show_all() if event is None: func = TreeViewHelper.make_popup_position_func(treeview) menu.popup(None, None, func, 3, 0) else: menu.popup(None, None, None, event.button, event.time) return True def on_mark_episodes_as_old(self, item): assert self.active_channel is not None for episode in self.active_channel.get_all_episodes(): if not episode.was_downloaded(and_exists=True): episode.mark(is_played=True) self.update_podcast_list_model(selected=True) self.update_episode_list_icons(all=True) def on_open_download_folder(self, item): assert self.active_channel is not None util.gui_open(self.active_channel.save_dir) def treeview_channels_show_context_menu(self, treeview, event=None): model, paths = self.treeview_handle_context_menu_click(treeview, event) if not paths: return True # Check for valid channel id, if there's no id then # assume that it is a proxy channel or equivalent # and cannot be operated with right click if self.active_channel.id is None: return True if event is None or event.button == 3: menu = gtk.Menu() item = gtk.ImageMenuItem( _('Update podcast')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_REFRESH, gtk.ICON_SIZE_MENU)) item.connect('activate', self.on_itemUpdateChannel_activate) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('Open download folder')) item.connect('activate', self.on_open_download_folder) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('Mark episodes as old')) item.connect('activate', self.on_mark_episodes_as_old) menu.append(item) item = gtk.CheckMenuItem(_('Archive')) item.set_active(self.active_channel.auto_archive_episodes) item.connect('activate', self.on_channel_toggle_lock_activate) menu.append(item) item = gtk.ImageMenuItem(_('Remove podcast')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_MENU)) item.connect( 'activate', self.on_itemRemoveChannel_activate) menu.append( item) result = gpodder.user_extensions.on_channel_context_menu(self.active_channel) if result: menu.append(gtk.SeparatorMenuItem()) for label, callback in result: item = gtk.MenuItem(label) item.connect('activate', lambda item, callback: callback(self.active_channel), callback) menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.ImageMenuItem(_('Podcast settings')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU)) item.connect('activate', self.on_itemEditChannel_activate) menu.append(item) menu.show_all() # Disable tooltips while we are showing the menu, so # the tooltip will not appear over the menu self.treeview_allow_tooltips(self.treeChannels, False) menu.connect('deactivate', lambda menushell: self.treeview_allow_tooltips(self.treeChannels, True)) if event is None: func = TreeViewHelper.make_popup_position_func(treeview) menu.popup(None, None, func, 3, 0) else: menu.popup(None, None, None, event.button, event.time) return True def cover_download_finished(self, channel, pixbuf): """ The Cover Downloader calls this when it has finished downloading (or registering, if already downloaded) a new channel cover, which is ready for displaying. """ util.idle_add(self.podcast_list_model.add_cover_by_channel, channel, pixbuf) def save_episodes_as_file(self, episodes): for episode in episodes: self.save_episode_as_file(episode) def save_episode_as_file(self, episode): PRIVATE_FOLDER_ATTRIBUTE = '_save_episodes_as_file_folder' if episode.was_downloaded(and_exists=True): folder = getattr(self, PRIVATE_FOLDER_ATTRIBUTE, None) copy_from = episode.local_filename(create=False) assert copy_from is not None copy_to = util.sanitize_filename(episode.sync_filename()) (result, folder) = self.show_copy_dialog(src_filename=copy_from, dst_filename=copy_to, dst_directory=folder) setattr(self, PRIVATE_FOLDER_ATTRIBUTE, folder) def copy_episodes_bluetooth(self, episodes): episodes_to_copy = [e for e in episodes if e.was_downloaded(and_exists=True)] def convert_and_send_thread(episode): for episode in episodes: filename = episode.local_filename(create=False) assert filename is not None destfile = os.path.join(tempfile.gettempdir(), \ util.sanitize_filename(episode.sync_filename())) (base, ext) = os.path.splitext(filename) if not destfile.endswith(ext): destfile += ext try: shutil.copyfile(filename, destfile) util.bluetooth_send_file(destfile) except: logger.error('Cannot copy "%s" to "%s".', filename, destfile) self.notification(_('Error converting file.'), _('Bluetooth file transfer'), important=True) util.delete_file(destfile) util.run_in_background(lambda: convert_and_send_thread(episodes_to_copy)) def _add_sub_menu(self, menu, label): root_item = gtk.MenuItem(label) menu.append(root_item) sub_menu = gtk.Menu() root_item.set_submenu(sub_menu) return sub_menu def _submenu_item_activate_hack(self, item, callback, *args): # See http://stackoverflow.com/questions/5221326/submenu-item-does-not-call-function-with-working-solution # Note that we can't just call the callback on button-press-event, as # it might be blocking (see http://gpodder.org/bug/1778), so we run # this in the GUI thread at a later point in time (util.idle_add). # Also, we also have to connect to the activate signal, as this is the # only signal that is fired when keyboard navigation is used. # It can happen that both (button-release-event and activate) signals # are fired, and we must avoid calling the callback twice. We do this # using a semaphore and only acquiring (but never releasing) it, making # sure that the util.idle_add() call below is only ever called once. only_once = threading.Semaphore(1) def handle_event(item, event=None): if only_once.acquire(False): util.idle_add(callback, *args) item.connect('button-press-event', handle_event) item.connect('activate', handle_event) def treeview_available_show_context_menu(self, treeview, event=None): model, paths = self.treeview_handle_context_menu_click(treeview, event) if not paths: if not hasattr(treeview, 'is_rubber_banding_active'): return True else: return not treeview.is_rubber_banding_active() if event is None or event.button == 3: episodes = self.get_selected_episodes() any_locked = any(e.archive for e in episodes) any_new = any(e.is_new for e in episodes) any_flattrable = any(e.payment_url for e in episodes) downloaded = all(e.was_downloaded(and_exists=True) for e in episodes) downloading = any(e.downloading for e in episodes) menu = gtk.Menu() (can_play, can_download, can_cancel, can_delete, open_instead_of_play) = self.play_or_download() if open_instead_of_play: item = gtk.ImageMenuItem(gtk.STOCK_OPEN) elif downloaded: item = gtk.ImageMenuItem(gtk.STOCK_MEDIA_PLAY) else: if downloading: item = gtk.ImageMenuItem(_('Preview')) else: item = gtk.ImageMenuItem(_('Stream')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU)) item.set_sensitive(can_play) item.connect('activate', self.on_playback_selected_episodes) menu.append(item) if not can_cancel: item = gtk.ImageMenuItem(_('Download')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_MENU)) item.set_sensitive(can_download) item.connect('activate', self.on_download_selected_episodes) menu.append(item) else: item = gtk.ImageMenuItem(gtk.STOCK_CANCEL) item.connect('activate', self.on_item_cancel_download_activate) menu.append(item) item = gtk.ImageMenuItem(gtk.STOCK_DELETE) item.set_sensitive(can_delete) item.connect('activate', self.on_btnDownloadedDelete_clicked) menu.append(item) result = gpodder.user_extensions.on_episodes_context_menu(episodes) if result: menu.append(gtk.SeparatorMenuItem()) submenus = {} for label, callback in result: key, sep, title = label.rpartition('/') item = gtk.ImageMenuItem(title) self._submenu_item_activate_hack(item, callback, episodes) if key: if key not in submenus: sub_menu = self._add_sub_menu(menu, key) submenus[key] = sub_menu else: sub_menu = submenus[key] sub_menu.append(item) else: menu.append(item) # Ok, this probably makes sense to only display for downloaded files if downloaded: menu.append(gtk.SeparatorMenuItem()) share_menu = self._add_sub_menu(menu, _('Send to')) item = gtk.ImageMenuItem(_('Local folder')) item.set_image(gtk.image_new_from_stock(gtk.STOCK_DIRECTORY, gtk.ICON_SIZE_MENU)) self._submenu_item_activate_hack(item, self.save_episodes_as_file, episodes) share_menu.append(item) if self.bluetooth_available: item = gtk.ImageMenuItem(_('Bluetooth device')) item.set_image(gtk.image_new_from_icon_name('bluetooth', gtk.ICON_SIZE_MENU)) self._submenu_item_activate_hack(item, self.copy_episodes_bluetooth, episodes) share_menu.append(item) menu.append(gtk.SeparatorMenuItem()) item = gtk.CheckMenuItem(_('New')) item.set_active(any_new) if any_new: item.connect('activate', lambda w: self.mark_selected_episodes_old()) else: item.connect('activate', lambda w: self.mark_selected_episodes_new()) menu.append(item) if downloaded: item = gtk.CheckMenuItem(_('Archive')) item.set_active(any_locked) item.connect('activate', lambda w: self.on_item_toggle_lock_activate( w, False, not any_locked)) menu.append(item) if any_flattrable and self.config.flattr.token: menu.append(gtk.SeparatorMenuItem()) item = gtk.MenuItem(_('Flattr this')) item.connect('activate', self.flattr_selected_episodes) menu.append(item) menu.append(gtk.SeparatorMenuItem()) # Single item, add episode information menu item item = gtk.ImageMenuItem(_('Episode details')) item.set_image(gtk.image_new_from_stock( gtk.STOCK_INFO, gtk.ICON_SIZE_MENU)) item.connect('activate', lambda w: self.show_episode_shownotes(episodes[0])) menu.append(item) menu.show_all() # Disable tooltips while we are showing the menu, so # the tooltip will not appear over the menu self.treeview_allow_tooltips(self.treeAvailable, False) menu.connect('deactivate', lambda menushell: self.treeview_allow_tooltips(self.treeAvailable, True)) if event is None: func = TreeViewHelper.make_popup_position_func(treeview) menu.popup(None, None, func, 3, 0) else: menu.popup(None, None, None, event.button, event.time) return True def set_title(self, new_title): self.default_title = new_title self.gPodder.set_title(new_title) def update_episode_list_icons(self, urls=None, selected=False, all=False): """ Updates the status icons in the episode list. If urls is given, it should be a list of URLs of episodes that should be updated. If urls is None, set ONE OF selected, all to True (the former updates just the selected episodes and the latter updates all episodes). """ descriptions = self.config.episode_list_descriptions if urls is not None: # We have a list of URLs to walk through self.episode_list_model.update_by_urls(urls, descriptions) elif selected and not all: # We should update all selected episodes selection = self.treeAvailable.get_selection() model, paths = selection.get_selected_rows() for path in reversed(paths): iter = model.get_iter(path) self.episode_list_model.update_by_filter_iter(iter, descriptions) elif all and not selected: # We update all (even the filter-hidden) episodes self.episode_list_model.update_all(descriptions) else: # Wrong/invalid call - have to specify at least one parameter raise ValueError('Invalid call to update_episode_list_icons') def episode_list_status_changed(self, episodes): self.update_episode_list_icons(set(e.url for e in episodes)) self.update_podcast_list_model(set(e.channel.url for e in episodes)) self.db.commit() def streaming_possible(self): # User has to have a media player set on the Desktop, or else we # would probably open the browser when giving a URL to xdg-open.. return (self.config.player and self.config.player != 'default') def playback_episodes_for_real(self, episodes): groups = collections.defaultdict(list) for episode in episodes: file_type = episode.file_type() if file_type == 'video' and self.config.videoplayer and \ self.config.videoplayer != 'default': player = self.config.videoplayer elif file_type == 'audio' and self.config.player and \ self.config.player != 'default': player = self.config.player else: player = 'default' # Mark episode as played in the database episode.playback_mark() self.mygpo_client.on_playback([episode]) fmt_ids = youtube.get_fmt_ids(self.config.youtube) allow_partial = (player != 'default') filename = episode.get_playback_url(fmt_ids, allow_partial) # Determine the playback resume position - if the file # was played 100%, we simply start from the beginning resume_position = episode.current_position if resume_position == episode.total_time: resume_position = 0 # If Panucci is configured, use D-Bus to call it if player == 'panucci': try: PANUCCI_NAME = 'org.panucci.panucciInterface' PANUCCI_PATH = '/panucciInterface' PANUCCI_INTF = 'org.panucci.panucciInterface' o = gpodder.dbus_session_bus.get_object(PANUCCI_NAME, PANUCCI_PATH) i = dbus.Interface(o, PANUCCI_INTF) def on_reply(*args): pass def error_handler(filename, err): logger.error('Exception in D-Bus call: %s', str(err)) # Fallback: use the command line client for command in util.format_desktop_command('panucci', \ [filename]): logger.info('Executing: %s', repr(command)) subprocess.Popen(command) on_error = lambda err: error_handler(filename, err) # This method only exists in Panucci > 0.9 ('new Panucci') i.playback_from(filename, resume_position, \ reply_handler=on_reply, error_handler=on_error) continue # This file was handled by the D-Bus call except Exception, e: logger.error('Calling Panucci using D-Bus', exc_info=True) # flattr episode if auto-flattr is enabled if (episode.payment_url and self.config.flattr.token and self.config.flattr.flattr_on_play): success, message = self.flattr.flattr_url(episode.payment_url) self.show_message(message, title=_('Flattr status'), important=not success) groups[player].append(filename) # Open episodes with system default player if 'default' in groups: for filename in groups['default']: logger.debug('Opening with system default: %s', filename) util.gui_open(filename) del groups['default'] # For each type now, go and create play commands for group in groups: for command in util.format_desktop_command(group, groups[group], resume_position): logger.debug('Executing: %s', repr(command)) subprocess.Popen(command) # Persist episode status changes to the database self.db.commit() # Flush updated episode status self.mygpo_client.flush() def playback_episodes(self, episodes): # We need to create a list, because we run through it more than once episodes = list(Model.sort_episodes_by_pubdate(e for e in episodes if \ e.was_downloaded(and_exists=True) or self.streaming_possible())) try: self.playback_episodes_for_real(episodes) except Exception, e: logger.error('Error in playback!', exc_info=True) self.show_message(_('Please check your media player settings in the preferences dialog.'), \ _('Error opening player'), widget=self.toolPreferences) channel_urls = set() episode_urls = set() for episode in episodes: channel_urls.add(episode.channel.url) episode_urls.add(episode.url) self.update_episode_list_icons(episode_urls) self.update_podcast_list_model(channel_urls) def play_or_download(self): if self.wNotebook.get_current_page() > 0: self.toolCancel.set_sensitive(True) return if self.currently_updating: return (False, False, False, False, False, False) ( can_play, can_download, can_cancel, can_delete ) = (False,)*4 ( is_played, is_locked ) = (False,)*2 open_instead_of_play = False selection = self.treeAvailable.get_selection() if selection.count_selected_rows() > 0: (model, paths) = selection.get_selected_rows() for path in paths: try: episode = model.get_value(model.get_iter(path), EpisodeListModel.C_EPISODE) except TypeError, te: logger.error('Invalid episode at path %s', str(path)) continue if episode.file_type() not in ('audio', 'video'): open_instead_of_play = True if episode.was_downloaded(): can_play = episode.was_downloaded(and_exists=True) is_played = not episode.is_new is_locked = episode.archive if not can_play: can_download = True else: if episode.downloading: can_cancel = True else: can_download = True can_download = can_download and not can_cancel can_play = self.streaming_possible() or (can_play and not can_cancel and not can_download) can_delete = not can_cancel if open_instead_of_play: self.toolPlay.set_stock_id(gtk.STOCK_OPEN) else: self.toolPlay.set_stock_id(gtk.STOCK_MEDIA_PLAY) self.toolPlay.set_sensitive( can_play) self.toolDownload.set_sensitive( can_download) self.toolCancel.set_sensitive( can_cancel) self.item_cancel_download.set_sensitive(can_cancel) self.itemDownloadSelected.set_sensitive(can_download) self.itemOpenSelected.set_sensitive(can_play) self.itemPlaySelected.set_sensitive(can_play) self.itemDeleteSelected.set_sensitive(can_delete) self.item_toggle_played.set_sensitive(can_play) self.item_toggle_lock.set_sensitive(can_play) self.itemOpenSelected.set_visible(open_instead_of_play) self.itemPlaySelected.set_visible(not open_instead_of_play) return (can_play, can_download, can_cancel, can_delete, open_instead_of_play) def on_cbMaxDownloads_toggled(self, widget, *args): self.spinMaxDownloads.set_sensitive(self.cbMaxDownloads.get_active()) def on_cbLimitDownloads_toggled(self, widget, *args): self.spinLimitDownloads.set_sensitive(self.cbLimitDownloads.get_active()) def episode_new_status_changed(self, urls): self.update_podcast_list_model() self.update_episode_list_icons(urls) def update_podcast_list_model(self, urls=None, selected=False, select_url=None, sections_changed=False): """Update the podcast list treeview model If urls is given, it should list the URLs of each podcast that has to be updated in the list. If selected is True, only update the model contents for the currently-selected podcast - nothing more. The caller can optionally specify "select_url", which is the URL of the podcast that is to be selected in the list after the update is complete. This only works if the podcast list has to be reloaded; i.e. something has been added or removed since the last update of the podcast list). """ selection = self.treeChannels.get_selection() model, iter = selection.get_selected() is_section = lambda r: r[PodcastListModel.C_URL] == '-' is_separator = lambda r: r[PodcastListModel.C_SEPARATOR] sections_active = any(is_section(x) for x in self.podcast_list_model) if self.config.podcast_list_view_all: # Update "all episodes" view in any case (if enabled) self.podcast_list_model.update_first_row() # List model length minus 1, because of "All" list_model_length = len(self.podcast_list_model) - 1 else: list_model_length = len(self.podcast_list_model) force_update = (sections_active != self.config.podcast_list_sections or sections_changed) # Filter items in the list model that are not podcasts, so we get the # correct podcast list count (ignore section headers and separators) is_not_podcast = lambda r: is_section(r) or is_separator(r) list_model_length -= len(filter(is_not_podcast, self.podcast_list_model)) if selected and not force_update: # very cheap! only update selected channel if iter is not None: # If we have selected the "all episodes" view, we have # to update all channels for selected episodes: if self.config.podcast_list_view_all and \ self.podcast_list_model.iter_is_first_row(iter): urls = self.get_podcast_urls_from_selected_episodes() self.podcast_list_model.update_by_urls(urls) else: # Otherwise just update the selected row (a podcast) self.podcast_list_model.update_by_filter_iter(iter) if self.config.podcast_list_sections: self.podcast_list_model.update_sections() elif list_model_length == len(self.channels) and not force_update: # we can keep the model, but have to update some if urls is None: # still cheaper than reloading the whole list self.podcast_list_model.update_all() else: # ok, we got a bunch of urls to update self.podcast_list_model.update_by_urls(urls) if self.config.podcast_list_sections: self.podcast_list_model.update_sections() else: if model and iter and select_url is None: # Get the URL of the currently-selected podcast select_url = model.get_value(iter, PodcastListModel.C_URL) # Update the podcast list model with new channels self.podcast_list_model.set_channels(self.db, self.config, self.channels) try: selected_iter = model.get_iter_first() # Find the previously-selected URL in the new # model if we have an URL (else select first) if select_url is not None: pos = model.get_iter_first() while pos is not None: url = model.get_value(pos, PodcastListModel.C_URL) if url == select_url: selected_iter = pos break pos = model.iter_next(pos) if selected_iter is not None: selection.select_iter(selected_iter) self.on_treeChannels_cursor_changed(self.treeChannels) except: logger.error('Cannot select podcast in list', exc_info=True) def on_episode_list_filter_changed(self, has_episodes): pass # XXX: Remove? def update_episode_list_model(self): if self.channels and self.active_channel is not None: self.currently_updating = True self.episode_list_model.clear() def update(): descriptions = self.config.episode_list_descriptions self.episode_list_model.replace_from_channel(self.active_channel, descriptions) self.treeAvailable.get_selection().unselect_all() self.treeAvailable.scroll_to_point(0, 0) self.currently_updating = False self.play_or_download() util.idle_add(update) else: self.episode_list_model.clear() @dbus.service.method(gpodder.dbus_interface) def offer_new_episodes(self, channels=None): new_episodes = self.get_new_episodes(channels) if new_episodes: self.new_episodes_show(new_episodes) return True return False def add_podcast_list(self, podcasts, auth_tokens=None): """Subscribe to a list of podcast given (title, url) pairs If auth_tokens is given, it should be a dictionary mapping URLs to (username, password) tuples.""" if auth_tokens is None: auth_tokens = {} existing_urls = set(podcast.url for podcast in self.channels) # For a given URL, the desired title (or None) title_for_url = {} # Sort and split the URL list into five buckets queued, failed, existing, worked, authreq = [], [], [], [], [] for input_title, input_url in podcasts: url = util.normalize_feed_url(input_url) if url is None: # Fail this one because the URL is not valid failed.append(input_url) elif url in existing_urls: # A podcast already exists in the list for this URL existing.append(url) # XXX: Should we try to update the title of the existing # subscription from input_title here if it is different? else: # This URL has survived the first round - queue for add title_for_url[url] = input_title queued.append(url) if url != input_url and input_url in auth_tokens: auth_tokens[url] = auth_tokens[input_url] error_messages = {} redirections = {} progress = ProgressIndicator(_('Adding podcasts'), \ _('Please wait while episode information is downloaded.'), \ parent=self.get_dialog_parent()) def on_after_update(): progress.on_finished() # Report already-existing subscriptions to the user if existing: title = _('Existing subscriptions skipped') message = _('You are already subscribed to these podcasts:') \ + '\n\n' + '\n'.join(cgi.escape(url) for url in existing) self.show_message(message, title, widget=self.treeChannels) # Report subscriptions that require authentication retry_podcasts = {} if authreq: for url in authreq: title = _('Podcast requires authentication') message = _('Please login to %s:') % (cgi.escape(url),) success, auth_tokens = self.show_login_dialog(title, message) if success: retry_podcasts[url] = auth_tokens else: # Stop asking the user for more login data retry_podcasts = {} for url in authreq: error_messages[url] = _('Authentication failed') failed.append(url) break # Report website redirections for url in redirections: title = _('Website redirection detected') message = _('The URL %(url)s redirects to %(target)s.') \ + '\n\n' + _('Do you want to visit the website now?') message = message % {'url': url, 'target': redirections[url]} if self.show_confirmation(message, title): util.open_website(url) else: break # Report failed subscriptions to the user if failed: title = _('Could not add some podcasts') message = _('Some podcasts could not be added to your list:') \ + '\n\n' + '\n'.join(cgi.escape('%s: %s' % (url, \ error_messages.get(url, _('Unknown')))) for url in failed) self.show_message(message, title, important=True) # Upload subscription changes to gpodder.net self.mygpo_client.on_subscribe(worked) # Fix URLs if mygpo has rewritten them self.rewrite_urls_mygpo() # If only one podcast was added, select it after the update if len(worked) == 1: url = worked[0] else: url = None # Update the list of subscribed podcasts self.update_podcast_list_model(select_url=url) # If we have authentication data to retry, do so here if retry_podcasts: podcasts = [(title_for_url.get(url), url) for url in retry_podcasts.keys()] self.add_podcast_list(podcasts, retry_podcasts) # This will NOT show new episodes for podcasts that have # been added ("worked"), but it will prevent problems with # multiple dialogs being open at the same time ;) return # Offer to download new episodes episodes = [] for podcast in self.channels: if podcast.url in worked: episodes.extend(podcast.get_all_episodes()) if episodes: episodes = list(Model.sort_episodes_by_pubdate(episodes, \ reverse=True)) self.new_episodes_show(episodes, \ selected=[e.check_is_new() for e in episodes]) @util.run_in_background def thread_proc(): # After the initial sorting and splitting, try all queued podcasts length = len(queued) for index, url in enumerate(queued): title = title_for_url.get(url) progress.on_progress(float(index)/float(length)) progress.on_message(title or url) try: # The URL is valid and does not exist already - subscribe! channel = self.model.load_podcast(url=url, create=True, \ authentication_tokens=auth_tokens.get(url, None), \ max_episodes=self.config.max_episodes_per_feed) try: username, password = util.username_password_from_url(url) except ValueError, ve: username, password = (None, None) if title is not None: # Prefer title from subscription source (bug 1711) channel.title = title if username is not None and channel.auth_username is None and \ password is not None and channel.auth_password is None: channel.auth_username = username channel.auth_password = password channel.save() self._update_cover(channel) except feedcore.AuthenticationRequired: if url in auth_tokens: # Fail for wrong authentication data error_messages[url] = _('Authentication failed') failed.append(url) else: # Queue for login dialog later authreq.append(url) continue except feedcore.WifiLogin, error: redirections[url] = error.data failed.append(url) error_messages[url] = _('Redirection detected') continue except Exception, e: logger.error('Subscription error: %s', e, exc_info=True) error_messages[url] = str(e) failed.append(url) continue assert channel is not None worked.append(channel.url) util.idle_add(on_after_update) def find_episode(self, podcast_url, episode_url): """Find an episode given its podcast and episode URL The function will return a PodcastEpisode object if the episode is found, or None if it's not found. """ for podcast in self.channels: if podcast_url == podcast.url: for episode in podcast.get_all_episodes(): if episode_url == episode.url: return episode return None def process_received_episode_actions(self): """Process/merge episode actions from gpodder.net This function will merge all changes received from the server to the local database and update the status of the affected episodes as necessary. """ indicator = ProgressIndicator(_('Merging episode actions'), \ _('Episode actions from gpodder.net are merged.'), \ False, self.get_dialog_parent()) while gtk.events_pending(): gtk.main_iteration(False) self.mygpo_client.process_episode_actions(self.find_episode) indicator.on_finished() self.db.commit() def _update_cover(self, channel): if channel is not None: self.cover_downloader.request_cover(channel) def show_update_feeds_buttons(self): # Make sure that the buttons for updating feeds # appear - this should happen after a feed update self.hboxUpdateFeeds.hide() self.btnUpdateFeeds.show() self.itemUpdate.set_sensitive(True) self.itemUpdateChannel.set_sensitive(True) def on_btnCancelFeedUpdate_clicked(self, widget): if not self.feed_cache_update_cancelled: self.pbFeedUpdate.set_text(_('Cancelling...')) self.feed_cache_update_cancelled = True self.btnCancelFeedUpdate.set_sensitive(False) else: self.show_update_feeds_buttons() def update_feed_cache(self, channels=None, show_new_episodes_dialog=True): if not util.connection_available(): self.show_message(_('Please connect to a network, then try again.'), _('No network connection'), important=True) return # Fix URLs if mygpo has rewritten them self.rewrite_urls_mygpo() if channels is None: # Only update podcasts for which updates are enabled channels = [c for c in self.channels if not c.pause_subscription] self.itemUpdate.set_sensitive(False) self.itemUpdateChannel.set_sensitive(False) self.feed_cache_update_cancelled = False self.btnCancelFeedUpdate.show() self.btnCancelFeedUpdate.set_sensitive(True) self.btnCancelFeedUpdate.set_image(gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON)) self.hboxUpdateFeeds.show_all() self.btnUpdateFeeds.hide() count = len(channels) text = N_('Updating %(count)d feed...', 'Updating %(count)d feeds...', count) % {'count':count} self.pbFeedUpdate.set_text(text) self.pbFeedUpdate.set_fraction(0) @util.run_in_background def update_feed_cache_proc(): updated_channels = [] for updated, channel in enumerate(channels): if self.feed_cache_update_cancelled: break try: channel.update(max_episodes=self.config.max_episodes_per_feed) self._update_cover(channel) except Exception, e: d = {'url': cgi.escape(channel.url), 'message': cgi.escape(str(e))} if d['message']: message = _('Error while updating %(url)s: %(message)s') else: message = _('The feed at %(url)s could not be updated.') self.notification(message % d, _('Error while updating feed'), widget=self.treeChannels) logger.error('Error: %s', str(e), exc_info=True) updated_channels.append(channel) def update_progress(channel): self.update_podcast_list_model([channel.url]) # If the currently-viewed podcast is updated, reload episodes if self.active_channel is not None and \ self.active_channel == channel: logger.debug('Updated channel is active, updating UI') self.update_episode_list_model() d = {'podcast': channel.title, 'position': updated+1, 'total': count} progression = _('Updated %(podcast)s (%(position)d/%(total)d)') % d self.pbFeedUpdate.set_text(progression) self.pbFeedUpdate.set_fraction(float(updated+1)/float(count)) util.idle_add(update_progress, channel) def update_feed_cache_finish_callback(): # Process received episode actions for all updated URLs self.process_received_episode_actions() # If we are currently viewing "All episodes", update its episode list now if self.active_channel is not None and \ getattr(self.active_channel, 'ALL_EPISODES_PROXY', False): self.update_episode_list_model() if self.feed_cache_update_cancelled: # The user decided to abort the feed update self.show_update_feeds_buttons() # Only search for new episodes in podcasts that have been # updated, not in other podcasts (for single-feed updates) episodes = self.get_new_episodes([c for c in updated_channels]) if not episodes: # Nothing new here - but inform the user self.pbFeedUpdate.set_fraction(1.0) self.pbFeedUpdate.set_text(_('No new episodes')) self.feed_cache_update_cancelled = True self.btnCancelFeedUpdate.show() self.btnCancelFeedUpdate.set_sensitive(True) self.itemUpdate.set_sensitive(True) self.btnCancelFeedUpdate.set_image(gtk.image_new_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_BUTTON)) else: count = len(episodes) # New episodes are available self.pbFeedUpdate.set_fraction(1.0) if self.config.auto_download == 'download': self.download_episode_list(episodes) title = N_('Downloading %(count)d new episode.', 'Downloading %(count)d new episodes.', count) % {'count':count} self.show_message(title, _('New episodes available'), widget=self.labelDownloads) elif self.config.auto_download == 'queue': self.download_episode_list_paused(episodes) title = N_('%(count)d new episode added to download list.', '%(count)d new episodes added to download list.', count) % {'count':count} self.show_message(title, _('New episodes available'), widget=self.labelDownloads) else: if (show_new_episodes_dialog and self.config.auto_download == 'show'): self.new_episodes_show(episodes, notification=True) else: # !show_new_episodes_dialog or auto_download == 'ignore' message = N_('%(count)d new episode available', '%(count)d new episodes available', count) % {'count':count} self.pbFeedUpdate.set_text(message) self.show_update_feeds_buttons() util.idle_add(update_feed_cache_finish_callback) def on_gPodder_delete_event(self, widget, *args): """Called when the GUI wants to close the window Displays a confirmation dialog (and closes/hides gPodder) """ downloading = self.download_status_model.are_downloads_in_progress() if downloading: dialog = gtk.MessageDialog(self.gPodder, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_NONE) dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) quit_button = dialog.add_button(gtk.STOCK_QUIT, gtk.RESPONSE_CLOSE) title = _('Quit gPodder') message = _('You are downloading episodes. You can resume downloads the next time you start gPodder. Do you want to quit now?') dialog.set_title(title) dialog.set_markup('%s\n\n%s'%(title, message)) quit_button.grab_focus() result = dialog.run() dialog.destroy() if result == gtk.RESPONSE_CLOSE: self.close_gpodder() else: self.close_gpodder() return True def quit_cb(self, macapp): """Called when OSX wants to quit the app (Cmd-Q or gPodder > Quit) """ # Event can't really be cancelled - don't even try self.close_gpodder() return False def close_gpodder(self): """ clean everything and exit properly """ self.gPodder.hide() # Notify all tasks to to carry out any clean-up actions self.download_status_model.tell_all_tasks_to_quit() while gtk.events_pending(): gtk.main_iteration(False) self.core.shutdown() self.quit() if macapp is None: sys.exit(0) def delete_episode_list(self, episodes, confirm=True, skip_locked=True, callback=None): if not episodes: return False if skip_locked: episodes = [e for e in episodes if not e.archive] if not episodes: title = _('Episodes are locked') message = _('The selected episodes are locked. Please unlock the episodes that you want to delete before trying to delete them.') self.notification(message, title, widget=self.treeAvailable) return False count = len(episodes) title = N_('Delete %(count)d episode?', 'Delete %(count)d episodes?', count) % {'count':count} message = _('Deleting episodes removes downloaded files.') if confirm and not self.show_confirmation(message, title): return False progress = ProgressIndicator(_('Deleting episodes'), \ _('Please wait while episodes are deleted'), \ parent=self.get_dialog_parent()) def finish_deletion(episode_urls, channel_urls): progress.on_finished() # Episodes have been deleted - persist the database self.db.commit() self.update_episode_list_icons(episode_urls) self.update_podcast_list_model(channel_urls) self.play_or_download() @util.run_in_background def thread_proc(): episode_urls = set() channel_urls = set() episodes_status_update = [] for idx, episode in enumerate(episodes): progress.on_progress(float(idx)/float(len(episodes))) if not episode.archive or not skip_locked: progress.on_message(episode.title) episode.delete_from_disk() episode_urls.add(episode.url) channel_urls.add(episode.channel.url) episodes_status_update.append(episode) # Notify the web service about the status update + upload self.mygpo_client.on_delete(episodes_status_update) self.mygpo_client.flush() if callback is None: util.idle_add(finish_deletion, episode_urls, channel_urls) else: util.idle_add(callback, episode_urls, channel_urls, progress) return True def on_itemRemoveOldEpisodes_activate(self, widget): self.show_delete_episodes_window() def show_delete_episodes_window(self, channel=None): """Offer deletion of episodes If channel is None, offer deletion of all episodes. Otherwise only offer deletion of episodes in the channel. """ columns = ( ('markup_delete_episodes', None, None, _('Episode')), ) msg_older_than = N_('Select older than %(count)d day', 'Select older than %(count)d days', self.config.episode_old_age) selection_buttons = { _('Select played'): lambda episode: not episode.is_new, _('Select finished'): lambda episode: episode.is_finished(), msg_older_than % {'count':self.config.episode_old_age}: lambda episode: episode.age_in_days() > self.config.episode_old_age, } instructions = _('Select the episodes you want to delete:') if channel is None: channels = self.channels else: channels = [channel] episodes = [] for channel in channels: for episode in channel.get_episodes(gpodder.STATE_DOWNLOADED): # Disallow deletion of locked episodes that still exist if not episode.archive or not episode.file_exists(): episodes.append(episode) selected = [not e.is_new or not e.file_exists() for e in episodes] gPodderEpisodeSelector(self.gPodder, title = _('Delete episodes'), instructions = instructions, \ episodes = episodes, selected = selected, columns = columns, \ stock_ok_button = gtk.STOCK_DELETE, callback = self.delete_episode_list, \ selection_buttons = selection_buttons, _config=self.config, \ show_episode_shownotes=self.show_episode_shownotes) def on_selected_episodes_status_changed(self): # The order of the updates here is important! When "All episodes" is # selected, the update of the podcast list model depends on the episode # list selection to determine which podcasts are affected. Updating # the episode list could remove the selection if a filter is active. self.update_podcast_list_model(selected=True) self.update_episode_list_icons(selected=True) self.db.commit() def mark_selected_episodes_new(self): for episode in self.get_selected_episodes(): episode.mark_new() self.on_selected_episodes_status_changed() def mark_selected_episodes_old(self): for episode in self.get_selected_episodes(): episode.mark_old() self.on_selected_episodes_status_changed() def flattr_selected_episodes(self, w=None): if not self.config.flattr.token: return for episode in [e for e in self.get_selected_episodes() if e.payment_url]: success, message = self.flattr.flattr_url(episode.payment_url) self.show_message(message, title=_('Flattr status'), important=not success) def on_item_toggle_played_activate( self, widget, toggle = True, new_value = False): for episode in self.get_selected_episodes(): if toggle: episode.mark(is_played=episode.is_new) else: episode.mark(is_played=new_value) self.on_selected_episodes_status_changed() def on_item_toggle_lock_activate(self, widget, toggle=True, new_value=False): for episode in self.get_selected_episodes(): if toggle: episode.mark(is_locked=not episode.archive) else: episode.mark(is_locked=new_value) self.on_selected_episodes_status_changed() def on_channel_toggle_lock_activate(self, widget, toggle=True, new_value=False): if self.active_channel is None: return self.active_channel.auto_archive_episodes = not self.active_channel.auto_archive_episodes self.active_channel.save() for episode in self.active_channel.get_all_episodes(): episode.mark(is_locked=self.active_channel.auto_archive_episodes) self.update_podcast_list_model(selected=True) self.update_episode_list_icons(all=True) def on_itemUpdateChannel_activate(self, widget=None): if self.active_channel is None: title = _('No podcast selected') message = _('Please select a podcast in the podcasts list to update.') self.show_message( message, title, widget=self.treeChannels) return # Dirty hack to check for "All episodes" (see gpodder.gtkui.model) if getattr(self.active_channel, 'ALL_EPISODES_PROXY', False): self.update_feed_cache() else: self.update_feed_cache(channels=[self.active_channel]) def on_itemUpdate_activate(self, widget=None): # Check if we have outstanding subscribe/unsubscribe actions self.on_add_remove_podcasts_mygpo() if self.channels: self.update_feed_cache() else: def show_welcome_window(): def on_show_example_podcasts(widget): welcome_window.main_window.response(gtk.RESPONSE_CANCEL) self.on_itemImportChannels_activate(None) def on_add_podcast_via_url(widget): welcome_window.main_window.response(gtk.RESPONSE_CANCEL) self.on_itemAddChannel_activate(None) def on_setup_my_gpodder(widget): welcome_window.main_window.response(gtk.RESPONSE_CANCEL) self.on_download_subscriptions_from_mygpo(None) welcome_window = gPodderWelcome(self.main_window, center_on_widget=self.main_window, on_show_example_podcasts=on_show_example_podcasts, on_add_podcast_via_url=on_add_podcast_via_url, on_setup_my_gpodder=on_setup_my_gpodder) welcome_window.main_window.run() welcome_window.main_window.destroy() util.idle_add(show_welcome_window) def download_episode_list_paused(self, episodes): self.download_episode_list(episodes, True) def download_episode_list(self, episodes, add_paused=False, force_start=False): enable_update = False for episode in episodes: logger.debug('Downloading episode: %s', episode.title) if not episode.was_downloaded(and_exists=True): task_exists = False for task in self.download_tasks_seen: if episode.url == task.url and task.status not in (task.DOWNLOADING, task.QUEUED): self.download_queue_manager.add_task(task, force_start) enable_update = True task_exists = True continue if task_exists: continue try: task = download.DownloadTask(episode, self.config) except Exception, e: d = {'episode': episode.title, 'message': str(e)} message = _('Download error while downloading %(episode)s: %(message)s') self.show_message(message % d, _('Download error'), important=True) logger.error('While downloading %s', episode.title, exc_info=True) continue if add_paused: task.status = task.PAUSED else: self.mygpo_client.on_download([task.episode]) self.download_queue_manager.add_task(task, force_start) self.download_status_model.register_task(task) enable_update = True if enable_update: self.enable_download_list_update() # Flush updated episode status self.mygpo_client.flush() def cancel_task_list(self, tasks): if not tasks: return for task in tasks: if task.status in (task.QUEUED, task.DOWNLOADING): task.status = task.CANCELLED elif task.status == task.PAUSED: task.status = task.CANCELLED # Call run, so the partial file gets deleted task.run() self.update_episode_list_icons([task.url for task in tasks]) self.play_or_download() # Update the tab title and downloads list self.update_downloads_list() def new_episodes_show(self, episodes, notification=False, selected=None): columns = ( ('markup_new_episodes', None, None, _('Episode')), ) instructions = _('Select the episodes you want to download:') if self.new_episodes_window is not None: self.new_episodes_window.main_window.destroy() self.new_episodes_window = None def download_episodes_callback(episodes): self.new_episodes_window = None self.download_episode_list(episodes) if selected is None: # Select all by default selected = [True]*len(episodes) self.new_episodes_window = gPodderEpisodeSelector(self.gPodder, \ title=_('New episodes available'), \ instructions=instructions, \ episodes=episodes, \ columns=columns, \ selected=selected, \ stock_ok_button = 'gpodder-download', \ callback=download_episodes_callback, \ remove_callback=lambda e: e.mark_old(), \ remove_action=_('Mark as old'), \ remove_finished=self.episode_new_status_changed, \ _config=self.config, \ show_notification=False, \ show_episode_shownotes=self.show_episode_shownotes) def on_itemDownloadAllNew_activate(self, widget, *args): if not self.offer_new_episodes(): self.show_message(_('Please check for new episodes later.'), \ _('No new episodes available'), widget=self.btnUpdateFeeds) def get_new_episodes(self, channels=None): return [e for c in channels or self.channels for e in filter(lambda e: e.check_is_new(), c.get_all_episodes())] def commit_changes_to_database(self): """This will be called after the sync process is finished""" self.db.commit() def on_itemShowAllEpisodes_activate(self, widget): self.config.podcast_list_view_all = widget.get_active() def on_itemShowToolbar_activate(self, widget): self.config.show_toolbar = self.itemShowToolbar.get_active() def on_itemShowDescription_activate(self, widget): self.config.episode_list_descriptions = self.itemShowDescription.get_active() def on_item_view_hide_boring_podcasts_toggled(self, toggleaction): self.config.podcast_list_hide_boring = toggleaction.get_active() if self.config.podcast_list_hide_boring: self.podcast_list_model.set_view_mode(self.config.episode_list_view_mode) else: self.podcast_list_model.set_view_mode(-1) def on_item_view_episodes_changed(self, radioaction, current): if current == self.item_view_episodes_all: self.config.episode_list_view_mode = EpisodeListModel.VIEW_ALL elif current == self.item_view_episodes_undeleted: self.config.episode_list_view_mode = EpisodeListModel.VIEW_UNDELETED elif current == self.item_view_episodes_downloaded: self.config.episode_list_view_mode = EpisodeListModel.VIEW_DOWNLOADED elif current == self.item_view_episodes_unplayed: self.config.episode_list_view_mode = EpisodeListModel.VIEW_UNPLAYED self.episode_list_model.set_view_mode(self.config.episode_list_view_mode) if self.config.podcast_list_hide_boring: self.podcast_list_model.set_view_mode(self.config.episode_list_view_mode) def on_itemPreferences_activate(self, widget, *args): gPodderPreferences(self.main_window, \ _config=self.config, \ flattr=self.flattr, \ user_apps_reader=self.user_apps_reader, \ parent_window=self.main_window, \ mygpo_client=self.mygpo_client, \ on_send_full_subscriptions=self.on_send_full_subscriptions, \ on_itemExportChannels_activate=self.on_itemExportChannels_activate) def on_goto_mygpo(self, widget): self.mygpo_client.open_website() def on_download_subscriptions_from_mygpo(self, action=None): title = _('Login to gpodder.net') message = _('Please login to download your subscriptions.') def on_register_button_clicked(): util.open_website('http://gpodder.net/register/') success, (username, password) = self.show_login_dialog(title, message, self.config.mygpo.username, self.config.mygpo.password, register_callback=on_register_button_clicked) if not success: return self.config.mygpo.username = username self.config.mygpo.password = password dir = gPodderPodcastDirectory(self.gPodder, _config=self.config, \ custom_title=_('Subscriptions on gpodder.net'), \ add_podcast_list=self.add_podcast_list, hide_url_entry=True) # TODO: Refactor this into "gpodder.my" or mygpoclient, so that # we do not have to hardcode the URL here OPML_URL = 'http://gpodder.net/subscriptions/%s.opml' % self.config.mygpo.username url = util.url_add_authentication(OPML_URL, \ self.config.mygpo.username, \ self.config.mygpo.password) dir.download_opml_file(url) def on_itemAddChannel_activate(self, widget=None): gPodderAddPodcast(self.gPodder, \ add_podcast_list=self.add_podcast_list) def on_itemEditChannel_activate(self, widget, *args): if self.active_channel is None: title = _('No podcast selected') message = _('Please select a podcast in the podcasts list to edit.') self.show_message( message, title, widget=self.treeChannels) return gPodderChannel(self.main_window, channel=self.active_channel, update_podcast_list_model=self.update_podcast_list_model, cover_downloader=self.cover_downloader, sections=set(c.section for c in self.channels), clear_cover_cache=self.podcast_list_model.clear_cover_cache, _config=self.config, _flattr=self.flattr) def on_itemMassUnsubscribe_activate(self, item=None): columns = ( ('title', None, None, _('Podcast')), ) # We're abusing the Episode Selector for selecting Podcasts here, # but it works and looks good, so why not? -- thp gPodderEpisodeSelector(self.main_window, \ title=_('Remove podcasts'), \ instructions=_('Select the podcast you want to remove.'), \ episodes=self.channels, \ columns=columns, \ size_attribute=None, \ stock_ok_button=_('Remove'), \ callback=self.remove_podcast_list, \ _config=self.config) def remove_podcast_list(self, channels, confirm=True): if not channels: return if len(channels) == 1: title = _('Removing podcast') info = _('Please wait while the podcast is removed') message = _('Do you really want to remove this podcast and its episodes?') else: title = _('Removing podcasts') info = _('Please wait while the podcasts are removed') message = _('Do you really want to remove the selected podcasts and their episodes?') if confirm and not self.show_confirmation(message, title): return progress = ProgressIndicator(title, info, parent=self.get_dialog_parent()) def finish_deletion(select_url): # Upload subscription list changes to the web service self.mygpo_client.on_unsubscribe([c.url for c in channels]) # Re-load the channels and select the desired new channel self.update_podcast_list_model(select_url=select_url) progress.on_finished() @util.run_in_background def thread_proc(): select_url = None for idx, channel in enumerate(channels): # Update the UI for correct status messages progress.on_progress(float(idx)/float(len(channels))) progress.on_message(channel.title) # Delete downloaded episodes channel.remove_downloaded() # cancel any active downloads from this channel for episode in channel.get_all_episodes(): if episode.downloading: episode.download_task.cancel() if len(channels) == 1: # get the URL of the podcast we want to select next if channel in self.channels: position = self.channels.index(channel) else: position = -1 if position == len(self.channels)-1: # this is the last podcast, so select the URL # of the item before this one (i.e. the "new last") select_url = self.channels[position-1].url else: # there is a podcast after the deleted one, so # we simply select the one that comes after it select_url = self.channels[position+1].url # Remove the channel and clean the database entries channel.delete() # Clean up downloads and download directories common.clean_up_downloads() # The remaining stuff is to be done in the GTK main thread util.idle_add(finish_deletion, select_url) def on_itemRemoveChannel_activate(self, widget, *args): if self.active_channel is None: title = _('No podcast selected') message = _('Please select a podcast in the podcasts list to remove.') self.show_message( message, title, widget=self.treeChannels) return self.remove_podcast_list([self.active_channel]) def get_opml_filter(self): filter = gtk.FileFilter() filter.add_pattern('*.opml') filter.add_pattern('*.xml') filter.set_name(_('OPML files')+' (*.opml, *.xml)') return filter def on_item_import_from_file_activate(self, widget, filename=None): if filename is None: dlg = gtk.FileChooserDialog(title=_('Import from OPML'), parent=self.main_window, action=gtk.FILE_CHOOSER_ACTION_OPEN) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_OPEN, gtk.RESPONSE_OK) dlg.set_filter(self.get_opml_filter()) response = dlg.run() filename = None if response == gtk.RESPONSE_OK: filename = dlg.get_filename() dlg.destroy() if filename is not None: dir = gPodderPodcastDirectory(self.gPodder, _config=self.config, \ custom_title=_('Import podcasts from OPML file'), \ add_podcast_list=self.add_podcast_list, hide_url_entry=True) dir.download_opml_file(filename) def on_itemExportChannels_activate(self, widget, *args): if not self.channels: title = _('Nothing to export') message = _('Your list of podcast subscriptions is empty. Please subscribe to some podcasts first before trying to export your subscription list.') self.show_message(message, title, widget=self.treeChannels) return dlg = gtk.FileChooserDialog(title=_('Export to OPML'), parent=self.gPodder, action=gtk.FILE_CHOOSER_ACTION_SAVE) dlg.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dlg.add_button(gtk.STOCK_SAVE, gtk.RESPONSE_OK) dlg.set_filter(self.get_opml_filter()) response = dlg.run() if response == gtk.RESPONSE_OK: filename = dlg.get_filename() dlg.destroy() exporter = opml.Exporter( filename) if filename is not None and exporter.write(self.channels): count = len(self.channels) title = N_('%(count)d subscription exported', '%(count)d subscriptions exported', count) % {'count':count} self.show_message(_('Your podcast list has been successfully exported.'), title, widget=self.treeChannels) else: self.show_message( _('Could not export OPML to file. Please check your permissions.'), _('OPML export failed'), important=True) else: dlg.destroy() def on_itemImportChannels_activate(self, widget, *args): dir = gPodderPodcastDirectory(self.main_window, _config=self.config, \ add_podcast_list=self.add_podcast_list) util.idle_add(dir.download_opml_file, my.EXAMPLES_OPML) def on_homepage_activate(self, widget, *args): util.open_website(gpodder.__url__) def on_wiki_activate(self, widget, *args): util.open_website('http://gpodder.org/wiki/User_Manual') def on_check_for_updates_activate(self, widget): self.check_for_updates(silent=False) def check_for_updates(self, silent): """Check for updates and (optionally) show a message If silent=False, a message will be shown even if no updates are available (set silent=False when the check is manually triggered). """ up_to_date, version, released, days = util.get_update_info() if up_to_date and not silent: title = _('No updates available') message = _('You have the latest version of gPodder.') self.show_message(message, title, important=True) if not up_to_date: title = _('New version available') message = '\n'.join([ _('Installed version: %s') % gpodder.__version__, _('Newest version: %s') % version, _('Release date: %s') % released, '', _('Download the latest version from gpodder.org?'), ]) if self.show_confirmation(message, title): util.open_website('http://gpodder.org/downloads') def on_bug_tracker_activate(self, widget, *args): util.open_website('https://bugs.gpodder.org/enter_bug.cgi?product=gPodder&component=Application&version=%s' % gpodder.__version__) def on_item_support_activate(self, widget): util.open_website('http://gpodder.org/donate') def on_itemAbout_activate(self, widget, *args): dlg = gtk.Dialog(_('About gPodder'), self.main_window, \ gtk.DIALOG_MODAL) dlg.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_OK).show() dlg.set_resizable(False) bg = gtk.HBox(spacing=10) bg.pack_start(gtk.image_new_from_file(gpodder.icon_file), expand=False) vb = gtk.VBox() vb.set_spacing(6) label = gtk.Label() label.set_alignment(0, 1) label.set_markup('gPodder %s' % gpodder.__version__) vb.pack_start(label) label = gtk.Label() label.set_alignment(0, 0) label.set_markup('%s' % \ ((cgi.escape(gpodder.__url__),)*2)) vb.pack_start(label) bg.pack_start(vb) out = gtk.VBox(spacing=10) out.set_border_width(12) out.pack_start(bg, expand=False) out.pack_start(gtk.HSeparator()) out.pack_start(gtk.Label(gpodder.__copyright__)) button_box = gtk.HButtonBox() button = gtk.Button(_('Donate / Wishlist')) button.connect('clicked', self.on_item_support_activate) button_box.pack_start(button) button = gtk.Button(_('Report a problem')) button.connect('clicked', self.on_bug_tracker_activate) button_box.pack_start(button) out.pack_start(button_box, expand=False) credits = gtk.TextView() credits.set_left_margin(5) credits.set_right_margin(5) credits.set_pixels_above_lines(5) credits.set_pixels_below_lines(5) credits.set_editable(False) credits.set_cursor_visible(False) sw = gtk.ScrolledWindow() sw.set_shadow_type(gtk.SHADOW_IN) sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) sw.add(credits) credits.set_size_request(-1, 160) out.pack_start(sw, expand=True, fill=True) dlg.vbox.pack_start(out, expand=False) dlg.connect('response', lambda dlg, response: dlg.destroy()) dlg.vbox.show_all() if os.path.exists(gpodder.credits_file): credits_txt = open(gpodder.credits_file).read().strip().split('\n') translator_credits = _('translator-credits') if translator_credits != 'translator-credits': app_authors = [_('Translation by:'), translator_credits, ''] else: app_authors = [] app_authors += [_('Thanks to:')] app_authors += credits_txt buffer = gtk.TextBuffer() buffer.set_text('\n'.join(app_authors)) credits.set_buffer(buffer) else: sw.hide() credits.grab_focus() dlg.run() def on_wNotebook_switch_page(self, notebook, page, page_num): if page_num == 0: self.play_or_download() # The message area in the downloads tab should be hidden # when the user switches away from the downloads tab if self.message_area is not None: self.message_area.hide() self.message_area = None else: self.toolDownload.set_sensitive(False) self.toolPlay.set_sensitive(False) self.toolCancel.set_sensitive(False) def on_treeChannels_row_activated(self, widget, path, *args): # double-click action of the podcast list or enter self.treeChannels.set_cursor(path) def on_treeChannels_cursor_changed(self, widget, *args): ( model, iter ) = self.treeChannels.get_selection().get_selected() if model is not None and iter is not None: old_active_channel = self.active_channel self.active_channel = model.get_value(iter, PodcastListModel.C_CHANNEL) if self.active_channel == old_active_channel: return # Dirty hack to check for "All episodes" (see gpodder.gtkui.model) if getattr(self.active_channel, 'ALL_EPISODES_PROXY', False): self.itemEditChannel.set_visible(False) self.itemRemoveChannel.set_visible(False) else: self.itemEditChannel.set_visible(True) self.itemRemoveChannel.set_visible(True) else: self.active_channel = None self.itemEditChannel.set_visible(False) self.itemRemoveChannel.set_visible(False) self.update_episode_list_model() def on_btnEditChannel_clicked(self, widget, *args): self.on_itemEditChannel_activate( widget, args) def get_podcast_urls_from_selected_episodes(self): """Get a set of podcast URLs based on the selected episodes""" return set(episode.channel.url for episode in \ self.get_selected_episodes()) def get_selected_episodes(self): """Get a list of selected episodes from treeAvailable""" selection = self.treeAvailable.get_selection() model, paths = selection.get_selected_rows() episodes = [model.get_value(model.get_iter(path), EpisodeListModel.C_EPISODE) for path in paths] return episodes def on_playback_selected_episodes(self, widget): self.playback_episodes(self.get_selected_episodes()) def on_shownotes_selected_episodes(self, widget): episodes = self.get_selected_episodes() if episodes: episode = episodes.pop(0) if episode is not None: self.show_episode_shownotes(episode) else: self.show_message(_('Please select an episode from the episode list to display shownotes.'), _('No episode selected'), widget=self.treeAvailable) def on_download_selected_episodes(self, widget): episodes = self.get_selected_episodes() self.download_episode_list(episodes) self.update_episode_list_icons([episode.url for episode in episodes]) self.play_or_download() def on_treeAvailable_row_activated(self, widget, path, view_column): """Double-click/enter action handler for treeAvailable""" self.on_shownotes_selected_episodes(widget) def show_episode_shownotes(self, episode): self.shownotes_object.set_episode(episode) def restart_auto_update_timer(self): if self._auto_update_timer_source_id is not None: logger.debug('Removing existing auto update timer.') gobject.source_remove(self._auto_update_timer_source_id) self._auto_update_timer_source_id = None if self.config.auto_update_feeds and \ self.config.auto_update_frequency: interval = 60*1000*self.config.auto_update_frequency logger.debug('Setting up auto update timer with interval %d.', self.config.auto_update_frequency) self._auto_update_timer_source_id = gobject.timeout_add(\ interval, self._on_auto_update_timer) def _on_auto_update_timer(self): if not util.connection_available(): logger.debug('Skipping auto update (no connection available)') return True logger.debug('Auto update timer fired.') self.update_feed_cache() # Ask web service for sub changes (if enabled) self.mygpo_client.flush() return True def on_treeDownloads_row_activated(self, widget, *args): # Use the standard way of working on the treeview selection = self.treeDownloads.get_selection() (model, paths) = selection.get_selected_rows() selected_tasks = [(gtk.TreeRowReference(model, path), model.get_value(model.get_iter(path), 0)) for path in paths] for tree_row_reference, task in selected_tasks: if task.status in (task.DOWNLOADING, task.QUEUED): task.status = task.PAUSED elif task.status in (task.CANCELLED, task.PAUSED, task.FAILED): self.download_queue_manager.add_task(task) self.enable_download_list_update() elif task.status == task.DONE: model.remove(model.get_iter(tree_row_reference.get_path())) self.play_or_download() # Update the tab title and downloads list self.update_downloads_list() def on_item_cancel_download_activate(self, widget): if self.wNotebook.get_current_page() == 0: selection = self.treeAvailable.get_selection() (model, paths) = selection.get_selected_rows() urls = [model.get_value(model.get_iter(path), \ self.episode_list_model.C_URL) for path in paths] selected_tasks = [task for task in self.download_tasks_seen \ if task.url in urls] else: selection = self.treeDownloads.get_selection() (model, paths) = selection.get_selected_rows() selected_tasks = [model.get_value(model.get_iter(path), \ self.download_status_model.C_TASK) for path in paths] self.cancel_task_list(selected_tasks) def on_btnCancelAll_clicked(self, widget, *args): self.cancel_task_list(self.download_tasks_seen) def on_btnDownloadedDelete_clicked(self, widget, *args): episodes = self.get_selected_episodes() if len(episodes) == 1: self.delete_episode_list(episodes, skip_locked=False) else: self.delete_episode_list(episodes) def on_key_press(self, widget, event): # Allow tab switching with Ctrl + PgUp/PgDown/Tab if event.state & gtk.gdk.CONTROL_MASK: if event.keyval == gtk.keysyms.Page_Up: self.wNotebook.prev_page() return True elif event.keyval == gtk.keysyms.Page_Down: self.wNotebook.next_page() return True elif event.keyval == gtk.keysyms.Tab: current_page = self.wNotebook.get_current_page() if current_page == self.wNotebook.get_n_pages()-1: self.wNotebook.set_current_page(0) else: self.wNotebook.next_page() return True return False def uniconify_main_window(self): if self.is_iconified(): # We need to hide and then show the window in WMs like Metacity # or KWin4 to move the window to the active workspace # (see http://gpodder.org/bug/1125) self.gPodder.hide() self.gPodder.show() self.gPodder.present() def iconify_main_window(self): if not self.is_iconified(): self.gPodder.iconify() @dbus.service.method(gpodder.dbus_interface) def show_gui_window(self): parent = self.get_dialog_parent() parent.present() @dbus.service.method(gpodder.dbus_interface) def subscribe_to_url(self, url): gPodderAddPodcast(self.gPodder, add_podcast_list=self.add_podcast_list, preset_url=url) @dbus.service.method(gpodder.dbus_interface) def mark_episode_played(self, filename): if filename is None: return False for channel in self.channels: for episode in channel.get_all_episodes(): fn = episode.local_filename(create=False, check_only=True) if fn == filename: episode.mark(is_played=True) self.db.commit() self.update_episode_list_icons([episode.url]) self.update_podcast_list_model([episode.channel.url]) return True return False def extensions_podcast_update_cb(self, podcast): logger.debug('extensions_podcast_update_cb(%s)', podcast) self.update_feed_cache(channels=[podcast], show_new_episodes_dialog=False) def extensions_episode_download_cb(self, episode): logger.debug('extension_episode_download_cb(%s)', episode) self.download_episode_list(episodes=[episode]) def on_sync_to_device_activate(self, widget, episodes=None, force_played=True): self.sync_ui = gPodderSyncUI(self.config, self.notification, self.main_window, self.show_confirmation, self.update_episode_list_icons, self.update_podcast_list_model, self.toolPreferences, self.channels, self.download_status_model, self.download_queue_manager, self.enable_download_list_update, self.commit_changes_to_database, self.delete_episode_list) self.sync_ui.on_synchronize_episodes(self.channels, episodes, force_played) def main(options=None): gobject.threads_init() gobject.set_application_name('gPodder') for i in range(EpisodeListModel.PROGRESS_STEPS + 1): pixbuf = draw_cake_pixbuf(float(i) / float(EpisodeListModel.PROGRESS_STEPS)) icon_name = 'gpodder-progress-%d' % i gtk.icon_theme_add_builtin_icon(icon_name, pixbuf.get_width(), pixbuf) gtk.window_set_default_icon_name('gpodder') gtk.about_dialog_set_url_hook(lambda dlg, link, data: util.open_website(link), None) try: dbus_main_loop = dbus.glib.DBusGMainLoop(set_as_default=True) gpodder.dbus_session_bus = dbus.SessionBus(dbus_main_loop) bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=gpodder.dbus_session_bus) except dbus.exceptions.DBusException, dbe: logger.warn('Cannot get "on the bus".', exc_info=True) dlg = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, \ gtk.BUTTONS_CLOSE, _('Cannot start gPodder')) dlg.format_secondary_markup(_('D-Bus error: %s') % (str(dbe),)) dlg.set_title('gPodder') dlg.run() dlg.destroy() sys.exit(0) gp = gPodder(bus_name, core.Core(UIConfig, model_class=Model)) # Handle options if options.subscribe: util.idle_add(gp.subscribe_to_url, options.subscribe) if gpodder.ui.osx: from gpodder.gtkui import macosx # Handle "subscribe to podcast" events from firefox macosx.register_handlers(gp) # Handle quit event if macapp is not None: macapp.connect('NSApplicationBlockTermination', gp.quit_cb) macapp.ready() gp.run() gpodder-3.5.2/src/gpodder/gtkui/model.py0000644000175000017500000007351112220076757017604 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.gtkui.model - GUI model classes for gPodder (2009-08-13) # Based on code from libpodcasts.py (thp, 2005-10-29) # import gpodder _ = gpodder.gettext from gpodder import util from gpodder import model from gpodder import query from gpodder import coverart import logging logger = logging.getLogger(__name__) from gpodder.gtkui import draw from gpodder.gtkui import flattr import os import gtk import gobject import cgi import re try: import gio have_gio = True except ImportError: have_gio = False # ---------------------------------------------------------- class GEpisode(model.PodcastEpisode): __slots__ = () @property def title_markup(self): return '%s\n%s' % (cgi.escape(self.title), cgi.escape(self.channel.title)) @property def markup_new_episodes(self): if self.file_size > 0: length_str = '%s; ' % util.format_filesize(self.file_size) else: length_str = '' return ('%s\n%s'+_('released %s')+ \ '; '+_('from %s')+'') % (\ cgi.escape(re.sub('\s+', ' ', self.title)), \ cgi.escape(length_str), \ cgi.escape(self.pubdate_prop), \ cgi.escape(re.sub('\s+', ' ', self.channel.title))) @property def markup_delete_episodes(self): if self.total_time and self.current_position: played_string = self.get_play_info_string() elif not self.is_new: played_string = _('played') else: played_string = _('unplayed') downloaded_string = self.get_age_string() if not downloaded_string: downloaded_string = _('today') return ('%s\n%s; %s; '+_('downloaded %s')+ \ '; '+_('from %s')+'') % (\ cgi.escape(self.title), \ cgi.escape(util.format_filesize(self.file_size)), \ cgi.escape(played_string), \ cgi.escape(downloaded_string), \ cgi.escape(self.channel.title)) class GPodcast(model.PodcastChannel): __slots__ = () EpisodeClass = GEpisode class Model(model.Model): PodcastClass = GPodcast # ---------------------------------------------------------- # Singleton indicator if a row is a section class SeparatorMarker(object): pass class SectionMarker(object): pass class EpisodeListModel(gtk.ListStore): C_URL, C_TITLE, C_FILESIZE_TEXT, C_EPISODE, C_STATUS_ICON, \ C_PUBLISHED_TEXT, C_DESCRIPTION, C_TOOLTIP, \ C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, \ C_VIEW_SHOW_UNPLAYED, C_FILESIZE, C_PUBLISHED, \ C_TIME, C_TIME_VISIBLE, C_TOTAL_TIME, \ C_LOCKED = range(17) VIEW_ALL, VIEW_UNDELETED, VIEW_DOWNLOADED, VIEW_UNPLAYED = range(4) # In which steps the UI is updated for "loading" animations _UI_UPDATE_STEP = .03 # Steps for the "downloading" icon progress PROGRESS_STEPS = 20 def __init__(self, config, on_filter_changed=lambda has_episodes: None): gtk.ListStore.__init__(self, str, str, str, object, \ str, str, str, str, bool, bool, bool, \ gobject.TYPE_INT64, int, str, bool, int, bool) self._config = config # Callback for when the filter / list changes, gets one parameter # (has_episodes) that is True if the list has any episodes self._on_filter_changed = on_filter_changed # Filter to allow hiding some episodes self._filter = self.filter_new() self._sorter = gtk.TreeModelSort(self._filter) self._view_mode = self.VIEW_ALL self._search_term = None self._search_term_eql = None self._filter.set_visible_func(self._filter_visible_func) # Are we currently showing the "all episodes" view? self._all_episodes_view = False self.ICON_AUDIO_FILE = 'audio-x-generic' self.ICON_VIDEO_FILE = 'video-x-generic' self.ICON_IMAGE_FILE = 'image-x-generic' self.ICON_GENERIC_FILE = 'text-x-generic' self.ICON_DOWNLOADING = gtk.STOCK_GO_DOWN self.ICON_DELETED = gtk.STOCK_DELETE if 'KDE_FULL_SESSION' in os.environ: # Workaround until KDE adds all the freedesktop icons # See https://bugs.kde.org/show_bug.cgi?id=233505 and # http://gpodder.org/bug/553 self.ICON_DELETED = 'archive-remove' def _format_filesize(self, episode): if episode.file_size > 0: return util.format_filesize(episode.file_size, digits=1) else: return None def _filter_visible_func(self, model, iter): # If searching is active, set visibility based on search text if self._search_term is not None: episode = model.get_value(iter, self.C_EPISODE) if episode is None: return False try: return self._search_term_eql.match(episode) except Exception, e: return True if self._view_mode == self.VIEW_ALL: return True elif self._view_mode == self.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == self.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == self.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True def get_filtered_model(self): """Returns a filtered version of this episode model The filtered version should be displayed in the UI, as this model can have some filters set that should be reflected in the UI. """ return self._sorter def has_episodes(self): """Returns True if episodes are visible (filtered) If episodes are visible with the current filter applied, return True (otherwise return False). """ return bool(len(self._filter)) def set_view_mode(self, new_mode): """Sets a new view mode for this model After setting the view mode, the filtered model might be updated to reflect the new mode.""" if self._view_mode != new_mode: self._view_mode = new_mode self._filter.refilter() self._on_filter_changed(self.has_episodes()) def get_view_mode(self): """Returns the currently-set view mode""" return self._view_mode def set_search_term(self, new_term): if self._search_term != new_term: self._search_term = new_term self._search_term_eql = query.UserEQL(new_term) self._filter.refilter() self._on_filter_changed(self.has_episodes()) def get_search_term(self): return self._search_term def _format_description(self, episode, include_description=False): title = episode.trimmed_title a, b = '', '' if episode.state != gpodder.STATE_DELETED and episode.is_new: a, b = '', '' if include_description and self._all_episodes_view: return '%s%s%s\n%s' % (a, cgi.escape(title), b, _('from %s') % cgi.escape(episode.channel.title)) elif include_description: description = episode.one_line_description() if description.startswith(title): description = description[len(title):].strip() return '%s%s%s\n%s' % (a, cgi.escape(title), b, cgi.escape(description)) else: return ''.join((a, cgi.escape(title), b)) def replace_from_channel(self, channel, include_description=False, treeview=None): """ Add episode from the given channel to this model. Downloading should be a callback. include_description should be a boolean value (True if description is to be added to the episode row, or False if not) """ # Remove old episodes in the list store self.clear() if treeview is not None: util.idle_add(treeview.queue_draw) self._all_episodes_view = getattr(channel, 'ALL_EPISODES_PROXY', False) # Avoid gPodder bug 1291 if channel is None: episodes = [] else: episodes = channel.get_all_episodes() if not isinstance(episodes, list): episodes = list(episodes) count = len(episodes) for position, episode in enumerate(episodes): iter = self.append((episode.url, \ episode.title, \ self._format_filesize(episode), \ episode, \ None, \ episode.cute_pubdate(), \ '', \ '', \ True, \ True, \ True, \ episode.file_size, \ episode.published, \ episode.get_play_info_string(), \ bool(episode.total_time), \ episode.total_time, \ episode.archive)) self.update_by_iter(iter, include_description) self._on_filter_changed(self.has_episodes()) def update_all(self, include_description=False): for row in self: self.update_by_iter(row.iter, include_description) def update_by_urls(self, urls, include_description=False): for row in self: if row[self.C_URL] in urls: self.update_by_iter(row.iter, include_description) def update_by_filter_iter(self, iter, include_description=False): # Convenience function for use by "outside" methods that use iters # from the filtered episode list model (i.e. all UI things normally) iter = self._sorter.convert_iter_to_child_iter(None, iter) self.update_by_iter(self._filter.convert_iter_to_child_iter(iter), include_description) def update_by_iter(self, iter, include_description=False): episode = self.get_value(iter, self.C_EPISODE) show_bullet = False show_padlock = False show_missing = False status_icon = None tooltip = [] view_show_undeleted = True view_show_downloaded = False view_show_unplayed = False icon_theme = gtk.icon_theme_get_default() if episode.downloading: tooltip.append('%s %d%%' % (_('Downloading'), int(episode.download_task.progress*100))) index = int(self.PROGRESS_STEPS*episode.download_task.progress) status_icon = 'gpodder-progress-%d' % index view_show_downloaded = True view_show_unplayed = True else: if episode.state == gpodder.STATE_DELETED: tooltip.append(_('Deleted')) status_icon = self.ICON_DELETED view_show_undeleted = False elif episode.state == gpodder.STATE_NORMAL and \ episode.is_new: tooltip.append(_('New episode')) view_show_downloaded = True view_show_unplayed = True elif episode.state == gpodder.STATE_DOWNLOADED: tooltip = [] view_show_downloaded = True view_show_unplayed = episode.is_new show_bullet = episode.is_new show_padlock = episode.archive show_missing = not episode.file_exists() filename = episode.local_filename(create=False, check_only=True) file_type = episode.file_type() if file_type == 'audio': tooltip.append(_('Downloaded episode')) status_icon = self.ICON_AUDIO_FILE elif file_type == 'video': tooltip.append(_('Downloaded video episode')) status_icon = self.ICON_VIDEO_FILE elif file_type == 'image': tooltip.append(_('Downloaded image')) status_icon = self.ICON_IMAGE_FILE else: tooltip.append(_('Downloaded file')) status_icon = self.ICON_GENERIC_FILE # Try to find a themed icon for this file if filename is not None and have_gio: file = gio.File(filename) if file.query_exists(): file_info = file.query_info('*') icon = file_info.get_icon() for icon_name in icon.get_names(): if icon_theme.has_icon(icon_name): status_icon = icon_name break if show_missing: tooltip.append(_('missing file')) else: if show_bullet: if file_type == 'image': tooltip.append(_('never displayed')) elif file_type in ('audio', 'video'): tooltip.append(_('never played')) else: tooltip.append(_('never opened')) else: if file_type == 'image': tooltip.append(_('displayed')) elif file_type in ('audio', 'video'): tooltip.append(_('played')) else: tooltip.append(_('opened')) if show_padlock: tooltip.append(_('deletion prevented')) if episode.total_time > 0 and episode.current_position: tooltip.append('%d%%' % (100.*float(episode.current_position)/float(episode.total_time),)) if episode.total_time: total_time = util.format_time(episode.total_time) if total_time: tooltip.append(total_time) tooltip = ', '.join(tooltip) description = self._format_description(episode, include_description) self.set(iter, \ self.C_STATUS_ICON, status_icon, \ self.C_VIEW_SHOW_UNDELETED, view_show_undeleted, \ self.C_VIEW_SHOW_DOWNLOADED, view_show_downloaded, \ self.C_VIEW_SHOW_UNPLAYED, view_show_unplayed, \ self.C_DESCRIPTION, description, \ self.C_TOOLTIP, tooltip, \ self.C_TIME, episode.get_play_info_string(duration_only=True), \ self.C_TIME_VISIBLE, bool(episode.total_time), \ self.C_TOTAL_TIME, episode.total_time, \ self.C_LOCKED, episode.archive, \ self.C_FILESIZE_TEXT, self._format_filesize(episode), \ self.C_FILESIZE, episode.file_size) class PodcastChannelProxy(object): ALL_EPISODES_PROXY = True def __init__(self, db, config, channels): self._db = db self._config = config self.channels = channels self.title = _('All episodes') self.description = _('from all podcasts') #self.parse_error = '' self.url = '' self.section = '' self.id = None self.cover_file = coverart.CoverDownloader.ALL_EPISODES_ID self.cover_url = None self.auth_username = None self.auth_password = None self.pause_subscription = False self.sync_to_mp3_player = False self.auto_archive_episodes = False def get_statistics(self): # Get the total statistics for all channels from the database return self._db.get_podcast_statistics() def get_all_episodes(self): """Returns a generator that yields every episode""" return Model.sort_episodes_by_pubdate((e for c in self.channels for e in c.get_all_episodes()), True) class PodcastListModel(gtk.ListStore): C_URL, C_TITLE, C_DESCRIPTION, C_PILL, C_CHANNEL, \ C_COVER, C_ERROR, C_PILL_VISIBLE, \ C_VIEW_SHOW_UNDELETED, C_VIEW_SHOW_DOWNLOADED, \ C_VIEW_SHOW_UNPLAYED, C_HAS_EPISODES, C_SEPARATOR, \ C_DOWNLOADS, C_COVER_VISIBLE, C_SECTION = range(16) SEARCH_COLUMNS = (C_TITLE, C_DESCRIPTION, C_SECTION) @classmethod def row_separator_func(cls, model, iter): return model.get_value(iter, cls.C_SEPARATOR) def __init__(self, cover_downloader): gtk.ListStore.__init__(self, str, str, str, gtk.gdk.Pixbuf, \ object, gtk.gdk.Pixbuf, str, bool, bool, bool, bool, \ bool, bool, int, bool, str) # Filter to allow hiding some episodes self._filter = self.filter_new() self._view_mode = -1 self._search_term = None self._filter.set_visible_func(self._filter_visible_func) self._cover_cache = {} self._max_image_side = 40 self._cover_downloader = cover_downloader self.ICON_DISABLED = 'gtk-media-pause' def _filter_visible_func(self, model, iter): # If searching is active, set visibility based on search text if self._search_term is not None: if model.get_value(iter, self.C_CHANNEL) == SectionMarker: return True key = self._search_term.lower() columns = (model.get_value(iter, c) for c in self.SEARCH_COLUMNS) return any((key in c.lower() for c in columns if c is not None)) if model.get_value(iter, self.C_SEPARATOR): return True elif self._view_mode == EpisodeListModel.VIEW_ALL: return model.get_value(iter, self.C_HAS_EPISODES) elif self._view_mode == EpisodeListModel.VIEW_UNDELETED: return model.get_value(iter, self.C_VIEW_SHOW_UNDELETED) elif self._view_mode == EpisodeListModel.VIEW_DOWNLOADED: return model.get_value(iter, self.C_VIEW_SHOW_DOWNLOADED) elif self._view_mode == EpisodeListModel.VIEW_UNPLAYED: return model.get_value(iter, self.C_VIEW_SHOW_UNPLAYED) return True def get_filtered_model(self): """Returns a filtered version of this episode model The filtered version should be displayed in the UI, as this model can have some filters set that should be reflected in the UI. """ return self._filter def set_view_mode(self, new_mode): """Sets a new view mode for this model After setting the view mode, the filtered model might be updated to reflect the new mode.""" if self._view_mode != new_mode: self._view_mode = new_mode self._filter.refilter() def get_view_mode(self): """Returns the currently-set view mode""" return self._view_mode def set_search_term(self, new_term): if self._search_term != new_term: self._search_term = new_term self._filter.refilter() def get_search_term(self): return self._search_term def enable_separators(self, channeltree): channeltree.set_row_separator_func(self._show_row_separator) def _show_row_separator(self, model, iter): return model.get_value(iter, self.C_SEPARATOR) def _resize_pixbuf_keep_ratio(self, url, pixbuf): """ Resizes a GTK Pixbuf but keeps its aspect ratio. Returns None if the pixbuf does not need to be resized or the newly resized pixbuf if it does. """ changed = False result = None if url in self._cover_cache: return self._cover_cache[url] # Resize if too wide if pixbuf.get_width() > self._max_image_side: f = float(self._max_image_side)/pixbuf.get_width() (width, height) = (int(pixbuf.get_width()*f), int(pixbuf.get_height()*f)) pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR) changed = True # Resize if too high if pixbuf.get_height() > self._max_image_side: f = float(self._max_image_side)/pixbuf.get_height() (width, height) = (int(pixbuf.get_width()*f), int(pixbuf.get_height()*f)) pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR) changed = True if changed: self._cover_cache[url] = pixbuf result = pixbuf return result def _resize_pixbuf(self, url, pixbuf): if pixbuf is None: return None return self._resize_pixbuf_keep_ratio(url, pixbuf) or pixbuf def _overlay_pixbuf(self, pixbuf, icon): try: icon_theme = gtk.icon_theme_get_default() emblem = icon_theme.load_icon(icon, self._max_image_side/2, 0) (width, height) = (emblem.get_width(), emblem.get_height()) xpos = pixbuf.get_width() - width ypos = pixbuf.get_height() - height if ypos < 0: # need to resize overlay for none standard icon size emblem = icon_theme.load_icon(icon, pixbuf.get_height() - 1, 0) (width, height) = (emblem.get_width(), emblem.get_height()) xpos = pixbuf.get_width() - width ypos = pixbuf.get_height() - height emblem.composite(pixbuf, xpos, ypos, width, height, xpos, ypos, 1, 1, gtk.gdk.INTERP_BILINEAR, 255) except: pass return pixbuf def _get_cover_image(self, channel, add_overlay=False): if self._cover_downloader is None: return None pixbuf = self._cover_downloader.get_cover(channel, avoid_downloading=True) pixbuf_overlay = self._resize_pixbuf(channel.url, pixbuf) if add_overlay and channel.pause_subscription: pixbuf_overlay = self._overlay_pixbuf(pixbuf_overlay, self.ICON_DISABLED) pixbuf_overlay.saturate_and_pixelate(pixbuf_overlay, 0.0, False) return pixbuf_overlay def _get_pill_image(self, channel, count_downloaded, count_unplayed): if count_unplayed > 0 or count_downloaded > 0: return draw.draw_pill_pixbuf(str(count_unplayed), str(count_downloaded)) else: return None def _format_description(self, channel, total, deleted, \ new, downloaded, unplayed): title_markup = cgi.escape(channel.title) if not channel.pause_subscription: description_markup = cgi.escape(util.get_first_line(channel.description) or ' ') else: description_markup = cgi.escape(_('Subscription paused')) d = [] if new: d.append('') d.append(title_markup) if new: d.append('') if description_markup.strip(): return ''.join(d+['\n', '', description_markup, '']) else: return ''.join(d) def _format_error(self, channel): #if channel.parse_error: # return str(channel.parse_error) #else: # return None return None def set_channels(self, db, config, channels): # Clear the model and update the list of podcasts self.clear() def channel_to_row(channel, add_overlay=False): return (channel.url, '', '', None, channel, self._get_cover_image(channel, add_overlay), '', True, True, True, True, True, False, 0, True, '') if config.podcast_list_view_all and channels: all_episodes = PodcastChannelProxy(db, config, channels) iter = self.append(channel_to_row(all_episodes)) self.update_by_iter(iter) # Separator item if not config.podcast_list_sections: self.append(('', '', '', None, SeparatorMarker, None, '', True, True, True, True, True, True, 0, False, '')) def key_func(pair): section, podcast = pair return (section, model.Model.podcast_sort_key(podcast)) if config.podcast_list_sections: def convert(channels): for channel in channels: yield (channel.group_by, channel) else: def convert(channels): for channel in channels: yield (None, channel) added_sections = [] old_section = None for section, channel in sorted(convert(channels), key=key_func): if old_section != section: it = self.append(('-', section, '', None, SectionMarker, None, '', True, True, True, True, True, False, 0, False, section)) added_sections.append(it) old_section = section iter = self.append(channel_to_row(channel, True)) self.update_by_iter(iter) # Update section header stats only after all podcasts # have been added to the list to get the stats right for it in added_sections: self.update_by_iter(it) def get_filter_path_from_url(self, url): # Return the path of the filtered model for a given URL child_path = self.get_path_from_url(url) if child_path is None: return None else: return self._filter.convert_child_path_to_path(child_path) def get_path_from_url(self, url): # Return the tree model path for a given URL if url is None: return None for row in self: if row[self.C_URL] == url: return row.path return None def update_first_row(self): # Update the first row in the model (for "all episodes" updates) self.update_by_iter(self.get_iter_first()) def update_by_urls(self, urls): # Given a list of URLs, update each matching row for row in self: if row[self.C_URL] in urls: self.update_by_iter(row.iter) def iter_is_first_row(self, iter): iter = self._filter.convert_iter_to_child_iter(iter) path = self.get_path(iter) return (path == (0,)) def update_by_filter_iter(self, iter): self.update_by_iter(self._filter.convert_iter_to_child_iter(iter)) def update_all(self): for row in self: self.update_by_iter(row.iter) def update_sections(self): for row in self: if row[self.C_CHANNEL] is SectionMarker: self.update_by_iter(row.iter) def update_by_iter(self, iter): if iter is None: return # Given a GtkTreeIter, update volatile information channel = self.get_value(iter, self.C_CHANNEL) if channel is SectionMarker: section = self.get_value(iter, self.C_TITLE) # This row is a section header - update its visibility flags channels = [c for c in (row[self.C_CHANNEL] for row in self) if isinstance(c, GPodcast) and c.section == section] # Calculate the stats over all podcasts of this section total, deleted, new, downloaded, unplayed = map(sum, zip(*[c.get_statistics() for c in channels])) # We could customized the section header here with the list # of channels and their stats (i.e. add some "new" indicator) description = ' %s' % ( cgi.escape(section)) self.set(iter, self.C_DESCRIPTION, description, self.C_SECTION, section, self.C_VIEW_SHOW_UNDELETED, total - deleted > 0, self.C_VIEW_SHOW_DOWNLOADED, downloaded + new > 0, self.C_VIEW_SHOW_UNPLAYED, unplayed + new > 0) if (not isinstance(channel, GPodcast) and not isinstance(channel, PodcastChannelProxy)): return total, deleted, new, downloaded, unplayed = channel.get_statistics() description = self._format_description(channel, total, deleted, new, \ downloaded, unplayed) pill_image = self._get_pill_image(channel, downloaded, unplayed) self.set(iter, \ self.C_TITLE, channel.title, \ self.C_DESCRIPTION, description, \ self.C_SECTION, channel.section, \ self.C_ERROR, self._format_error(channel), \ self.C_PILL, pill_image, \ self.C_PILL_VISIBLE, pill_image != None, \ self.C_VIEW_SHOW_UNDELETED, total - deleted > 0, \ self.C_VIEW_SHOW_DOWNLOADED, downloaded + new > 0, \ self.C_VIEW_SHOW_UNPLAYED, unplayed + new > 0, \ self.C_HAS_EPISODES, total > 0, \ self.C_DOWNLOADS, downloaded) def clear_cover_cache(self, podcast_url): if podcast_url in self._cover_cache: logger.info('Clearing cover from cache: %s', podcast_url) del self._cover_cache[podcast_url] def add_cover_by_channel(self, channel, pixbuf): # Resize and add the new cover image pixbuf = self._resize_pixbuf(channel.url, pixbuf) if channel.pause_subscription: pixbuf = self._overlay_pixbuf(pixbuf, self.ICON_DISABLED) pixbuf.saturate_and_pixelate(pixbuf, 0.0, False) for row in self: if row[self.C_URL] == channel.url: row[self.C_COVER] = pixbuf break gpodder-3.5.2/src/gpodder/gtkui/opml.py0000644000175000017500000000264412220076757017452 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.gtkui.opml - Module for displaying OPML feeds (2009-08-13) # import gtk import cgi import urllib class OpmlListModel(gtk.ListStore): C_SELECTED, C_TITLE, C_DESCRIPTION_MARKUP, C_URL = range(4) def __init__(self, importer): gtk.ListStore.__init__(self, bool, str, str, str) for channel in importer.items: self.append([False, channel['title'], self._format_channel(channel), channel['url']]) def _format_channel(self, channel): title = cgi.escape(urllib.unquote_plus(channel['title'])) description = cgi.escape(channel['description']) return '%s\n%s' % (title, description) gpodder-3.5.2/src/gpodder/gtkui/services.py0000644000175000017500000001104312220076757020317 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.gtkui.services - UI parts for the services module (2009-08-24) # import gpodder _ = gpodder.gettext from gpodder.services import ObservableService import logging logger = logging.getLogger(__name__) from gpodder import util from gpodder import coverart import gtk class CoverDownloader(ObservableService): """ This class manages downloading cover art and notification of other parts of the system. Downloading cover art can happen either synchronously via get_cover() or in asynchronous mode via request_cover(). When in async mode, the cover downloader will send the cover via the 'cover-available' message (via the ObservableService). """ def __init__(self): self.downloader = coverart.CoverDownloader() signal_names = ['cover-available', 'cover-removed'] ObservableService.__init__(self, signal_names) def request_cover(self, channel, custom_url=None, avoid_downloading=False): """ Sends an asynchronous request to download a cover for the specific channel. After the cover has been downloaded, the "cover-available" signal will be sent with the channel url and new cover as pixbuf. If you specify a custom_url, the cover will be downloaded from the specified URL and not taken from the channel metadata. The optional parameter "avoid_downloading", when true, will make sure we return only already-downloaded covers and return None when we have no cover on the local disk. """ logger.debug('cover download request for %s', channel.url) util.run_in_background(lambda: self.__get_cover(channel, custom_url, True, avoid_downloading)) def get_cover(self, channel, custom_url=None, avoid_downloading=False): """ Sends a synchronous request to download a cover for the specified channel. The cover will be returned to the caller. The custom_url has the same semantics as in request_cover(). The optional parameter "avoid_downloading", when true, will make sure we return only already-downloaded covers and return None when we have no cover on the local disk. """ (url, pixbuf) = self.__get_cover(channel, custom_url, False, avoid_downloading) return pixbuf def replace_cover(self, channel, custom_url=None): """ This is a convenience function that deletes the current cover file and requests a new cover from the URL specified. """ self.request_cover(channel, custom_url) def __get_cover(self, channel, url, async=False, avoid_downloading=False): def get_filename(): return self.downloader.get_cover(channel.cover_file, url or channel.cover_url, channel.url, channel.title, channel.auth_username, channel.auth_password, not avoid_downloading) if url is not None: filename = get_filename() if filename.startswith(channel.cover_file): logger.info('Replacing cover: %s', filename) util.delete_file(filename) filename = get_filename() pixbuf = None try: pixbuf = gtk.gdk.pixbuf_new_from_file(filename) except Exception, e: logger.warn('Cannot load cover art', exc_info=True) if filename.startswith(channel.cover_file): logger.info('Deleting broken cover: %s', filename) util.delete_file(filename) filename = get_filename() pixbuf = gtk.gdk.pixbuf_new_from_file(filename) if async: self.notify('cover-available', channel, pixbuf) else: return (channel.url, pixbuf) gpodder-3.5.2/src/gpodder/gtkui/shownotes.py0000644000175000017500000001105212220076757020525 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gtk import gtk.gdk import gobject import pango import os import cgi import gpodder _ = gpodder.gettext import logging logger = logging.getLogger(__name__) from gpodder import util try: import webkit webview_signals = gobject.signal_list_names(webkit.WebView) if 'navigation-policy-decision-requested' in webview_signals: have_webkit = True else: logger.warn('Your WebKit is too old (gPodder bug 1001).') have_webkit = False except ImportError: have_webkit = False class gPodderShownotes: def __init__(self, scrolled_window): self.scrolled_window = scrolled_window self.scrolled_window.add(self.init()) self.scrolled_window.show_all() def set_episode(self, episode): if episode is None: self.clear() self.scrolled_window.hide() else: heading = episode.title subheading = _('from %s') % (episode.channel.title) self.update(heading, subheading, episode) self.scrolled_window.show() class gPodderShownotesText(gPodderShownotes): def init(self): self.text_view = gtk.TextView() self.text_view.set_wrap_mode(gtk.WRAP_WORD_CHAR) self.text_view.set_border_width(10) self.text_view.set_editable(False) self.text_buffer = gtk.TextBuffer() self.text_buffer.create_tag('heading', scale=pango.SCALE_LARGE, weight=pango.WEIGHT_BOLD) self.text_buffer.create_tag('subheading', scale=pango.SCALE_SMALL) self.text_view.set_buffer(self.text_buffer) self.text_view.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#ffffff')) return self.text_view def clear(self): self.text_buffer.set_text('') def update(self, heading, subheading, episode): self.text_buffer.set_text('') self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), heading, 'heading') self.text_buffer.insert_at_cursor('\n') self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), subheading, 'subheading') self.text_buffer.insert_at_cursor('\n\n') self.text_buffer.insert(self.text_buffer.get_end_iter(), util.remove_html_tags(episode.description)) self.text_buffer.place_cursor(self.text_buffer.get_start_iter()) class gPodderShownotesHTML(gPodderShownotes): SHOWNOTES_HTML_TEMPLATE = """ %s
      %s (%s)

      %s

      """ def init(self): self.html_view = webkit.WebView() self.html_view.connect('navigation-policy-decision-requested', self._navigation_policy_decision) self.html_view.load_html_string('', '') return self.html_view def _navigation_policy_decision(self, wv, fr, req, action, decision): REASON_LINK_CLICKED, REASON_OTHER = 0, 5 if action.get_reason() == REASON_LINK_CLICKED: util.open_website(req.get_uri()) decision.ignore() elif action.get_reason() == REASON_OTHER: decision.use() else: decision.ignore() def clear(self): self.html_view.load_html_string('', '') def update(self, heading, subheading, episode): html = self.SHOWNOTES_HTML_TEMPLATE % ( cgi.escape(heading), cgi.escape(subheading), episode.get_play_info_string(), episode.description_html, ) url = os.path.dirname(episode.channel.url) self.html_view.load_html_string(html, url) gpodder-3.5.2/src/gpodder/gtkui/widgets.py0000644000175000017500000001050412220076757020143 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # widgets.py -- Additional widgets for gPodder # Thomas Perl 2009-03-31 # import gtk import gobject import pango import cgi class SimpleMessageArea(gtk.HBox): """A simple, yellow message area. Inspired by gedit. Original C source code: http://svn.gnome.org/viewvc/gedit/trunk/gedit/gedit-message-area.c """ def __init__(self, message, buttons=()): gtk.HBox.__init__(self, spacing=6) self.set_border_width(6) self.__in_style_set = False self.connect('style-set', self.__style_set) self.connect('expose-event', self.__expose_event) self.__label = gtk.Label() self.__label.set_alignment(0.0, 0.5) self.__label.set_line_wrap(False) self.__label.set_ellipsize(pango.ELLIPSIZE_END) self.__label.set_markup('%s' % cgi.escape(message)) self.pack_start(self.__label, expand=True, fill=True) hbox = gtk.HBox() for button in buttons: hbox.pack_start(button, expand=True, fill=False) self.pack_start(hbox, expand=False, fill=False) def set_markup(self, markup, line_wrap=True, min_width=3, max_width=100): # The longest line should determine the size of the label width_chars = max(len(line) for line in markup.splitlines()) # Enforce upper and lower limits for the width width_chars = max(min_width, min(max_width, width_chars)) self.__label.set_width_chars(width_chars) self.__label.set_markup(markup) self.__label.set_line_wrap(line_wrap) def __style_set(self, widget, previous_style): if self.__in_style_set: return w = gtk.Window(gtk.WINDOW_POPUP) w.set_name('gtk-tooltip') w.ensure_style() style = w.get_style() self.__in_style_set = True self.set_style(style) self.__label.set_style(style) self.__in_style_set = False w.destroy() self.queue_draw() def __expose_event(self, widget, event): style = widget.get_style() rect = widget.get_allocation() style.paint_flat_box(widget.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, None, widget, "tooltip", rect.x, rect.y, rect.width, rect.height) return False class SpinningProgressIndicator(gtk.Image): # Progress indicator loading inspired by glchess from gnome-games-clutter def __init__(self, size=32): gtk.Image.__init__(self) self._frames = [] self._frame_id = 0 # Load the progress indicator icon_theme = gtk.icon_theme_get_default() try: icon = icon_theme.load_icon('process-working', size, 0) width, height = icon.get_width(), icon.get_height() if width < size or height < size: size = min(width, height) for row in range(height/size): for column in range(width/size): frame = icon.subpixbuf(column*size, row*size, size, size) self._frames.append(frame) # Remove the first frame (the "idle" icon) if self._frames: self._frames.pop(0) self.step_animation() except: # FIXME: This is not very beautiful :/ self.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_BUTTON) def step_animation(self): if len(self._frames) > 1: self._frame_id += 1 if self._frame_id >= len(self._frames): self._frame_id = 0 self.set_from_pixbuf(self._frames[self._frame_id]) gpodder-3.5.2/src/gpodder/pipe/0000755000175000017500000000000012220346122015717 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/pipe/__init__.py0000644000175000017500000001434712220076757020057 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.pipe - Socket/pipe-based backend for New UIs # Thomas Perl ; 2012-11-24 import gpodder from gpodder import core from gpodder import model from gpodder import util from gpodder import coverart try: # For Python < 2.6, we use the "simplejson" add-on module import simplejson as json except ImportError: # Python 2.6 already ships with a nice "json" module import json import os import re import sys import threading import Queue import time import fcntl def cmd(*signature): def wrapper(f): setattr(f, '_pipecmd', True) return f return wrapper def to_json(o): keys = list(('id',) + o.__slots__) values = list(getattr(o, key) for key in keys) yield keys yield values class PipeError(BaseException): pass class Pipe: def __init__(self, core, reader, writer): self.core = core self.model = self.core.model self.cover_download = coverart.CoverDownloader() self.reader = reader self.writer = writer self.events_in = Queue.Queue() self.events_out = Queue.Queue() def event_writer_proc(self): while True: item = self.events_out.get(True) self.writer.write(item.encode('utf-8') + '\n') self.writer.flush() def event_reader_proc(self): while True: args = self.events_in.get(True) cmd = args.pop(0) func = getattr(self, cmd, None) if func is not None: if getattr(func, '_pipecmd', False): try: result = func(*args) if result: self.event_out(result) except PipeError, e: self.event_out('! %s' % e) except Exception, e: print >>sys.stderr, 'FAIL:', e self.event_out('! %s' % e) raise continue self.event_out('? %s' % cmd) def event_in(self, data): self.events_in.put(data) def event_out(self, data): self.events_out.put(data) def find_episode(self, id): for podcast in self.model.get_podcasts(): for episode in podcast.get_all_episodes(): if episode.id == int(id): return episode raise PipeError('episode not found') def find_podcast(self, id): for podcast in self.model.get_podcasts(): if podcast.id == int(id): return podcast raise PipeError('podcast not found') def summarize_podcasts(self, podcasts): yield ('id', 'title', 'downloads', 'cover') for podcast in podcasts: total, deleted, new, downloaded, unplayed = podcast.get_statistics() cover_filename = self.cover_download.get_cover(podcast.cover_file, podcast.cover_url, podcast.url, podcast.title, podcast.auth_username, podcast.auth_password, False) yield (podcast.id, podcast.title, downloaded, cover_filename) def summarize_episodes(self, episodes): yield ('id', 'title', 'state') for episode in episodes: yield (episode.id, episode.title, episode.state) def serialize(self, data): return json.dumps(list(data), ensure_ascii=False) @cmd() def podcasts(self): return 'podcasts ' + self.serialize(self.summarize_podcasts(self.model.get_podcasts())) @cmd(int) def episodes(self, id): podcast = self.find_podcast(id) return 'episodes ' + id + ' ' + self.serialize(self.summarize_episodes(podcast.get_all_episodes())) @cmd(int) def episode(self, id): episode = self.find_episode(id) return 'episode ' + id + ' ' + self.serialize(to_json(episode)) @cmd(int) def podcast(self, id): podcast = self.find_podcast(id) return 'podcast ' + id + ' ' + self.serialize(to_json(podcast)) @cmd() def update_all(self): @util.run_in_background def update_proc(): for podcast in self.model.get_podcasts(): self.event_out('updating %d' % podcast.id) podcast.update() self.event_out('updated %d' % podcast.id) self.event_out('updated_all') @cmd(int) def update(self, id): @util.run_in_background def update_proc(): podcast = self.find_podcast(id) self.event_out('updating %d' % podcast.id) podcast.update() self.event_out('updated %d' % podcast.id) def run(self): def post_random_events(): while True: time.sleep(1) self.event_out('hello') time.sleep(2) self.event_out('hello 10') random_event_thread = threading.Thread(target=post_random_events) random_event_thread.setDaemon(True) #random_event_thread.start() reader_thread = threading.Thread(target=self.event_reader_proc) writer_thread = threading.Thread(target=self.event_writer_proc) reader_thread.setDaemon(True) writer_thread.setDaemon(True) reader_thread.start() writer_thread.start() while True: line = self.reader.readline() if not line: break line = line.rstrip() if line: self.event_in(line.split()) def main(core): pipe = Pipe(core, sys.stdin, sys.stdout) pipe.run() gpodder-3.5.2/src/gpodder/plugins/0000755000175000017500000000000012220346122016443 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/plugins/__init__.py0000644000175000017500000000137312220076757020576 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # gpodder-3.5.2/src/gpodder/plugins/soundcloud.py0000644000175000017500000001720612220076757021220 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Soundcloud.com API client module for gPodder # Thomas Perl ; 2009-11-03 import gpodder _ = gpodder.gettext from gpodder import model from gpodder import util try: # For Python < 2.6, we use the "simplejson" add-on module import simplejson as json except ImportError: # Python 2.6 already ships with a nice "json" module import json import os import time import re import email # gPodder's consumer key for the Soundcloud API CONSUMER_KEY = 'zrweghtEtnZLpXf3mlm8mQ' def soundcloud_parsedate(s): """Parse a string into a unix timestamp Only strings provided by Soundcloud's API are parsed with this function (2009/11/03 13:37:00). """ m = re.match(r'(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2})', s) return time.mktime([int(x) for x in m.groups()]+[0, 0, -1]) def get_param(s, param='filename', header='content-disposition'): """Get a parameter from a string of headers By default, this gets the "filename" parameter of the content-disposition header. This works fine for downloads from Soundcloud. """ msg = email.message_from_string(s) if header in msg: value = msg.get_param(param, header=header) decoded_list = email.header.decode_header(value) value = [] for part, encoding in decoded_list: if encoding: value.append(part.decode(encoding)) else: value.append(unicode(part)) return u''.join(value) return None def get_metadata(url): """Get file download metadata Returns a (size, type, name) from the given download URL. Will use the network connection to determine the metadata via the HTTP header fields. """ track_fp = util.urlopen(url) headers = track_fp.info() filesize = headers['content-length'] or '0' filetype = headers['content-type'] or 'application/octet-stream' headers_s = '\n'.join('%s:%s'%(k,v) for k, v in headers.items()) filename = get_param(headers_s) or os.path.basename(os.path.dirname(url)) track_fp.close() return filesize, filetype, filename class SoundcloudUser(object): def __init__(self, username): self.username = username self.cache_file = os.path.join(gpodder.home, 'Soundcloud') if os.path.exists(self.cache_file): try: self.cache = json.load(open(self.cache_file, 'r')) except: self.cache = {} else: self.cache = {} def commit_cache(self): json.dump(self.cache, open(self.cache_file, 'w')) def get_coverart(self): global CONSUMER_KEY key = ':'.join((self.username, 'avatar_url')) if key in self.cache: return self.cache[key] image = None try: json_url = 'http://api.soundcloud.com/users/%s.json?consumer_key=%s' % (self.username, CONSUMER_KEY) user_info = json.load(util.urlopen(json_url)) image = user_info.get('avatar_url', None) self.cache[key] = image finally: self.commit_cache() return image def get_tracks(self, feed): """Get a generator of tracks from a SC user The generator will give you a dictionary for every track it can find for its user.""" global CONSUMER_KEY try: json_url = 'http://api.soundcloud.com/users/%(user)s/%(feed)s.json?filter=downloadable&consumer_key=%(consumer_key)s' \ % { "user":self.username, "feed":feed, "consumer_key": CONSUMER_KEY } tracks = (track for track in json.load(util.urlopen(json_url)) \ if track['downloadable']) for track in tracks: # Prefer stream URL (MP3), fallback to download URL url = track.get('stream_url', track['download_url']) + \ '?consumer_key=%(consumer_key)s' \ % { 'consumer_key': CONSUMER_KEY } if url not in self.cache: try: self.cache[url] = get_metadata(url) except: continue filesize, filetype, filename = self.cache[url] yield { 'title': track.get('title', track.get('permalink')) or _('Unknown track'), 'link': track.get('permalink_url') or 'http://soundcloud.com/'+self.username, 'description': track.get('description') or _('No description available'), 'url': url, 'file_size': int(filesize), 'mime_type': filetype, 'guid': track.get('permalink', track.get('id')), 'published': soundcloud_parsedate(track.get('created_at', None)), } finally: self.commit_cache() class SoundcloudFeed(object): URL_REGEX = re.compile('http://([a-z]+\.)?soundcloud\.com/([^/]+)$', re.I) @classmethod def handle_url(cls, url): m = cls.URL_REGEX.match(url) if m is not None: subdomain, username = m.groups() return cls(username) def __init__(self, username): self.username = username self.sc_user = SoundcloudUser(username) def get_title(self): return _('%s on Soundcloud') % self.username def get_image(self): return self.sc_user.get_coverart() def get_link(self): return 'http://soundcloud.com/%s' % self.username def get_description(self): return _('Tracks published by %s on Soundcloud.') % self.username def get_new_episodes(self, channel, existing_guids): return self._get_new_episodes(channel, existing_guids, 'tracks') def _get_new_episodes(self, channel, existing_guids, track_type): tracks = [t for t in self.sc_user.get_tracks(track_type)] seen_guids = [track['guid'] for track in tracks] episodes = [] for track in tracks: if track['guid'] not in existing_guids: episode = channel.episode_factory(track) episode.save() episodes.append(episode) return episodes, seen_guids class SoundcloudFavFeed(SoundcloudFeed): URL_REGEX = re.compile('http://([a-z]+\.)?soundcloud\.com/([^/]+)/favorites', re.I) def __init__(self, username): super(SoundcloudFavFeed,self).__init__(username) def get_title(self): return _('%s\'s favorites on Soundcloud') % self.username def get_link(self): return 'http://soundcloud.com/%s/favorites' % self.username def get_description(self): return _('Tracks favorited by %s on Soundcloud.') % self.username def get_new_episodes(self, channel, existing_guids): return self._get_new_episodes(channel, existing_guids, 'favorites') # Register our URL handlers model.register_custom_handler(SoundcloudFeed) model.register_custom_handler(SoundcloudFavFeed) gpodder-3.5.2/src/gpodder/plugins/xspf.py0000644000175000017500000001257512220076757020025 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # XSPF playlist parser module for gPodder # Thomas Perl ; 2010-08-07 # Currently, this is restricted to FM4 On Demand content, as the XSPF parser # here isn't generic enough to parse all other feeds reliably. Please get in # touch if you want support for other feeds - you can use the existing parser # as a template for your own! :) # # See http://fm4.orf.at/radio/stories/audio for available feeds import gpodder _ = gpodder.gettext from gpodder import model from gpodder import util import os import time import re import feedparser from xml.dom import minidom def get_metadata(url): """Get file download metadata Returns a (size, type, name) from the given download URL. Will use the network connection to determine the metadata via the HTTP header fields. """ track_fp = util.urlopen(url) headers = track_fp.info() filesize = headers['content-length'] or '0' filetype = headers['content-type'] or 'application/octet-stream' if 'last-modified' in headers: parsed_date = feedparser._parse_date(headers['last-modified']) filedate = time.mktime(parsed_date) else: filedate = None filename = os.path.basename(os.path.dirname(url)) track_fp.close() return filesize, filetype, filedate, filename class FM4OnDemandPlaylist(object): URL_REGEX = re.compile('http://onapp1\.orf\.at/webcam/fm4/fod/([^/]+)\.xspf$') CONTENT = { 'spezialmusik': ( 'FM4 Sendungen', 'http://onapp1.orf.at/webcam/fm4/fod/SOD_Bild_Spezialmusik.jpg', 'http://fm4.orf.at/', 'Sendungen jeweils sieben Tage zum Nachhören.', ), 'unlimited': ( 'FM4 Unlimited', 'http://onapp1.orf.at/webcam/fm4/fod/SOD_Bild_Unlimited.jpg', 'http://fm4.orf.at/unlimited', 'Montag bis Freitag (14-15 Uhr)', ), 'soundpark': ( 'FM4 Soundpark', 'http://onapp1.orf.at/webcam/fm4/fod/SOD_Bild_Soundpark.jpg', 'http://fm4.orf.at/soundpark', 'Nacht von Sonntag auf Montag (1-6 Uhr)', ), } @classmethod def handle_url(cls, url): m = cls.URL_REGEX.match(url) if m is not None: category = m.group(1) return cls(url, category) @classmethod def get_text_contents(cls, node): if hasattr(node, '__iter__'): return u''.join(cls.get_text_contents(x) for x in node) elif node.nodeType == node.TEXT_NODE: return node.data else: return u''.join(cls.get_text_contents(c) for c in node.childNodes) def __init__(self, url, category): self.url = url self.category = category # TODO: Use proper caching of contents with support for # conditional GETs (If-Modified-Since, ETag, ...) self.data = minidom.parse(util.urlopen(url)) self.playlist = self.data.getElementsByTagName('playlist')[0] def get_title(self): title = self.playlist.getElementsByTagName('title')[0] default = self.get_text_contents(title) return self.CONTENT.get(self.category, \ (default, None, None, None))[0] def get_image(self): return self.CONTENT.get(self.category, \ (None, None, None, None))[1] def get_link(self): return self.CONTENT.get(self.category, \ (None, None, 'http://fm4.orf.at/', None))[2] def get_description(self): return self.CONTENT.get(self.category, \ (None, None, None, 'XSPF playlist'))[3] def get_new_episodes(self, channel, existing_guids): tracks = [] seen_guids = [] for track in self.playlist.getElementsByTagName('track'): title = self.get_text_contents(track.getElementsByTagName('title')) url = self.get_text_contents(track.getElementsByTagName('location')) seen_guids.append(url) if url in existing_guids: continue filesize, filetype, filedate, filename = get_metadata(url) episode = channel.episode_factory({ 'title': title, 'link': '', 'description': '', 'url': url, 'file_size': int(filesize), 'mime_type': filetype, 'guid': url, 'published': filedate, }) episode.save() tracks.append(episode) return tracks, seen_guids # Register our URL handlers model.register_custom_handler(FM4OnDemandPlaylist) gpodder-3.5.2/src/gpodder/qmlui/0000755000175000017500000000000012220346122016111 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/qmlui/__init__.py0000644000175000017500000012431712220076757020250 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.qmlui - gPodder's QML interface # Thomas Perl ; 2011-02-06 from PySide.QtGui import QApplication from PySide.QtCore import Qt, QObject, Signal, Slot, Property, QUrl from PySide.QtCore import QAbstractListModel, QModelIndex from PySide.QtDeclarative import QDeclarativeView import os import signal import functools import itertools import subprocess import dbus import dbus.service from dbus.mainloop.glib import DBusGMainLoop import gpodder _ = gpodder.gettext N_ = gpodder.ngettext from gpodder import core from gpodder import util from gpodder import my from gpodder import query from gpodder import common from gpodder.model import Model from gpodder.qmlui import model from gpodder.qmlui import helper from gpodder.qmlui import images import logging logger = logging.getLogger("qmlui") EPISODE_LIST_FILTERS = [ # (UI label, EQL expression) (_('All'), None), (_('Hide deleted'), 'not deleted'), (_('New'), 'new or downloading'), (_('Downloaded'), 'downloaded or downloading'), (_('Deleted'), 'deleted'), (_('Finished'), 'finished'), (_('Archived'), 'downloaded and archive'), (_('Videos'), 'video'), (_('Partially played'), 'downloaded and played and not finished'), (_('Unplayed downloads'), 'downloaded and not played'), ] EPISODE_LIST_LIMIT = 200 def grouped(iterable, n): return itertools.izip(*[iter(iterable)]*n) class ConfigProxy(QObject): def __init__(self, config): QObject.__init__(self) self._config = config config.add_observer(self._on_config_changed) def _on_config_changed(self, name, old_value, new_value): if name == 'ui.qml.autorotate': self.autorotateChanged.emit() elif name == 'flattr.token': self.flattrTokenChanged.emit() elif name == 'flattr.flattr_on_play': self.flattrOnPlayChanged.emit() def get_autorotate(self): return self._config.ui.qml.autorotate def set_autorotate(self, autorotate): self._config.ui.qml.autorotate = autorotate autorotateChanged = Signal() autorotate = Property(bool, get_autorotate, set_autorotate, notify=autorotateChanged) def get_flattr_token(self): return self._config.flattr.token def set_flattr_token(self, flattr_token): self._config.flattr.token = flattr_token flattrTokenChanged = Signal() flattrToken = Property(unicode, get_flattr_token, set_flattr_token, notify=flattrTokenChanged) def get_flattr_on_play(self): return self._config.flattr.flattr_on_play def set_flattr_on_play(self, flattr_on_play): self._config.flattr.flattr_on_play = flattr_on_play flattrOnPlayChanged = Signal() flattrOnPlay = Property(bool, get_flattr_on_play, set_flattr_on_play, notify=flattrOnPlayChanged) class Controller(QObject): def __init__(self, root): QObject.__init__(self) self.root = root self.context_menu_actions = [] self.episode_list_title = u'' self.current_input_dialog = None self.root.config.add_observer(self.on_config_changed) self._flattr = self.root.core.flattr self.flattr_button_text = u'' self._busy = False self.updating_podcasts = 0 self.current_episode = None self._subscribe_in_progress = False # Upcalls to the GUI episodeUpdated = Signal(int) showMessage = Signal(unicode) showInputDialog = Signal(unicode, unicode, unicode, unicode, bool) openContextMenu = Signal('QVariant') startProgress = Signal(unicode) endProgress = Signal() clearEpisodeListModel = Signal() setEpisodeListModel = Signal() enqueueEpisode = Signal(QObject) removeQueuedEpisode = Signal(QObject) removeQueuedEpisodesForPodcast = Signal(QObject) shutdown = Signal() def on_config_changed(self, name, old_value, new_value): logger.info('Config changed: %s (%s -> %s)', name, old_value, new_value) if name == 'mygpo.enabled': self.myGpoEnabledChanged.emit() elif name == 'mygpo.username': self.myGpoUsernameChanged.emit() elif name == 'mygpo.password': self.myGpoPasswordChanged.emit() elif name == 'mygpo.device.caption': self.myGpoDeviceCaptionChanged.emit() busyChanged = Signal() def getBusy(self): return self._busy def setBusy(self, busy): if self._busy != busy: self._busy = busy self.busyChanged.emit() busy = Property(bool, getBusy, setBusy, notify=busyChanged) episodeListTitleChanged = Signal() def setEpisodeListTitle(self, title): if self.episode_list_title != title: self.episode_list_title = title self.episodeListTitleChanged.emit() def getEpisodeListTitle(self): return self.episode_list_title episodeListTitle = Property(unicode, getEpisodeListTitle, \ setEpisodeListTitle, notify=episodeListTitleChanged) flattrButtonTextChanged = Signal() def setFlattrButtonText(self, flattr_button_text): if self.flattr_button_text != flattr_button_text: self.flattr_button_text = flattr_button_text self.flattrButtonTextChanged.emit() def getFlattrButtonText(self): return self.flattr_button_text flattrButtonText = Property(unicode, getFlattrButtonText, setFlattrButtonText, notify=flattrButtonTextChanged) @Slot(QObject) def onPlayback(self, qepisode): if (qepisode.payment_url and self.root.config.flattr.token and self.root.config.flattr.flattr_on_play): success, message = self._flattr.flattr_url(qepisode.payment_url) if not success: logger.warn('Flattr message on playback action: %s', message) @Slot(QObject) def updateFlattrButtonText(self, qepisode): self.setFlattrButtonText('') if qepisode is None: return episode = qepisode._episode if not episode.payment_url: return if not self._flattr.has_token(): self.setFlattrButtonText(_('Sign in')) return @util.run_in_background def get_flattr_info(): flattrs, flattred = self._flattr.get_thing_info(episode.payment_url) if flattred: self.setFlattrButtonText(_('Flattred (%(count)d)') % { 'count': flattrs }) else: self.setFlattrButtonText(_('Flattr this (%(count)d)') % { 'count': flattrs }) @Slot(QObject) def flattrEpisode(self, qepisode): if not qepisode: return episode = qepisode._episode if not episode.payment_url: return if not self._flattr.has_token(): self.showMessage.emit(_('Sign in to Flattr in the settings.')) return self.startProgress.emit(_('Flattring episode...')) @util.run_in_background def flattr_episode(): try: success, message = self._flattr.flattr_url(episode.payment_url) if success: self.updateFlattrButtonText(qepisode) else: self.showMessage.emit(message) finally: self.endProgress.emit() @Slot(result=str) def getFlattrLoginURL(self): return self._flattr.get_auth_url() @Slot(result=str) def getFlattrCallbackURL(self): return self._flattr.CALLBACK @Slot(str) def processFlattrCode(self, url): if not self._flattr.process_retrieved_code(url): self.showMessage.emit(_('Could not log in to Flattr.')) @Slot(result='QStringList') def getEpisodeListFilterNames(self): return [caption for caption, eql in EPISODE_LIST_FILTERS] @Slot('QVariant', str) def multiEpisodeAction(self, selected, action): if not selected: return count = len(selected) # JS/QML/PySide might convert the array of indices to an array of floats, # so we need to convert these floats back to integers (bug 1802) selected = map(int, selected) episodes = map(lambda idx: self.root.episode_model._filtered[idx], selected) def delete(): for episode in episodes: if not episode.qarchive: episode.delete_episode() self.episodeUpdated.emit(episode.id) self.update_subset_stats() self.root.mygpo_client.on_delete(episodes) self.root.mygpo_client.flush() for episode in episodes: self.removeQueuedEpisode.emit(episode) util.run_in_background(self.root.episode_model.sort) if action == 'delete': msg = N_('Delete %(count)d episode?', 'Delete %(count)d episodes?', count) % {'count':count} self.confirm_action(msg, _('Delete'), delete) elif action == 'download': for episode in episodes: if episode.qdownloaded: print ' XXX already downloaded' continue self.downloadEpisode(episode) self.root.mygpo_client.on_download(episodes) self.root.mygpo_client.flush() elif action == 'play': for episode in episodes: self.enqueueEpisode.emit(episode) self.episodeUpdated.emit(episode.id) @Slot(str, result=str) def translate(self, x): return _(x) @Slot(str, str, int, result=str) def ntranslate(self, singular, plural, count): return N_(singular, plural, count) @Slot(str, int, result=str) def formatCount(self, template, count): return template % {'count': count} @Slot(result=str) def getVersion(self): return gpodder.__version__ @Slot(result=str) def getReleased(self): return gpodder.__date__ @Slot(result=unicode) def getCredits(self): credits_file = os.path.join(gpodder.prefix, 'share', 'gpodder', 'credits.txt') return util.convert_bytes(open(credits_file).read()) @Slot(result=unicode) def getCopyright(self): return util.convert_bytes(gpodder.__copyright__) @Slot(result=str) def getLicense(self): return gpodder.__license__ @Slot(result=str) def getURL(self): return gpodder.__url__ @Slot() def loadLastEpisode(self): self.root.load_last_episode() @Slot(QObject, int, int) def storePlaybackAction(self, episode, start, end): self.episodeUpdated.emit(episode.id) if end - 5 < start: logger.info('Ignoring too short playback action.') return total = episode.qduration self.root.mygpo_client.on_playback_full(episode, start, end, total) self.root.mygpo_client.flush() @Slot(QObject) def playVideo(self, episode): """Video Playback on MeeGo 1.2 Harmattan""" if episode.qnew: episode.toggle_new() self.update_subset_stats() url = episode.get_playback_url() if gpodder.ui.harmattan: subprocess.Popen(['video-suite', url]) else: util.gui_open(url) self.root.mygpo_client.on_playback([episode]) self.root.mygpo_client.flush() @Slot(QObject) def podcastSelected(self, podcast): self.setEpisodeListTitle(podcast.qtitle) util.run_in_background(lambda: self.root.select_podcast(podcast)) windowTitleChanged = Signal() def getWindowTitle(self): return self.root.view.windowTitle() def setWindowTitle(self, windowTitle): self.root.view.setWindowTitle(windowTitle) windowTitle = Property(unicode, getWindowTitle, setWindowTitle, notify=windowTitleChanged) @Slot() def myGpoUploadList(self): def upload_proc(self): self.startProgress.emit(_('Uploading subscriptions...')) try: try: self.root.mygpo_client.set_subscriptions([podcast.url for podcast in self.root.podcast_model.get_podcasts()]) except Exception, e: self.showMessage.emit('\n'.join((_('Error on upload:'), unicode(e)))) finally: self.endProgress.emit() util.run_in_background(lambda: upload_proc(self)) @Slot() def saveMyGpoSettings(self): # Update the device settings and upload changes self.root.mygpo_client.create_device() self.root.mygpo_client.flush(now=True) myGpoEnabledChanged = Signal() def getMyGpoEnabled(self): return self.root.config.mygpo.enabled def setMyGpoEnabled(self, enabled): self.root.config.mygpo.enabled = enabled myGpoEnabled = Property(bool, getMyGpoEnabled, setMyGpoEnabled, notify=myGpoEnabledChanged) myGpoUsernameChanged = Signal() def getMyGpoUsername(self): return model.convert(self.root.config.mygpo.username) def setMyGpoUsername(self, username): self.root.config.mygpo.username = username myGpoUsername = Property(unicode, getMyGpoUsername, setMyGpoUsername, notify=myGpoUsernameChanged) myGpoPasswordChanged = Signal() def getMyGpoPassword(self): return model.convert(self.root.config.mygpo.password) def setMyGpoPassword(self, password): self.root.config.mygpo.password = password myGpoPassword = Property(unicode, getMyGpoPassword, setMyGpoPassword, notify=myGpoPasswordChanged) myGpoDeviceCaptionChanged = Signal() def getMyGpoDeviceCaption(self): return model.convert(self.root.config.mygpo.device.caption) def setMyGpoDeviceCaption(self, caption): self.root.config.mygpo.device.caption = caption myGpoDeviceCaption = Property(unicode, getMyGpoDeviceCaption, setMyGpoDeviceCaption, notify=myGpoDeviceCaptionChanged) @Slot(QObject) def podcastContextMenu(self, podcast): menu = [] if isinstance(podcast, model.EpisodeSubsetView): menu.append(helper.Action(_('Update all'), 'update-all', podcast)) else: menu.append(helper.Action(_('Update'), 'update', podcast)) menu.append(helper.Action(_('Mark episodes as old'), 'mark-as-read', podcast)) menu.append(helper.Action(_('Rename'), 'rename-podcast', podcast)) menu.append(helper.Action(_('Change section'), 'change-section', podcast)) menu.append(helper.Action(_('Unsubscribe'), 'unsubscribe', podcast)) #menu.append(helper.Action('Force update all', 'force-update-all', podcast)) #menu.append(helper.Action('Force update', 'force-update', podcast)) self.show_context_menu(menu) def show_context_menu(self, actions): actions = filter(lambda a: a.caption != '', actions) self.context_menu_actions = actions self.openContextMenu.emit(self.context_menu_actions) def finished_update(self): if self.updating_podcasts > 0: self.updating_podcasts -= 1 self.setBusy(self.updating_podcasts > 0) self.update_subset_stats() def update_subset_stats(self): # This should be called when an episode changes state, # so that all subset views (e.g. "All episodes") can # update its status (i.e. download/new counts, etc..) for podcast in self.root.podcast_model.get_objects(): if isinstance(podcast, model.EpisodeSubsetView): podcast.qupdate() def find_episode(self, podcast_url, episode_url): for podcast in self.root.podcast_model.get_podcasts(): if podcast.url == podcast_url: for episode in podcast.get_all_episodes(): if episode.url == episode_url: return episode return None @Slot(QObject) def updatePodcast(self, podcast): if not self.request_connection(): return if not podcast.pause_subscription: podcast.qupdate(finished_callback=self.update_subset_stats) @Slot() def updateAllPodcasts(self): if not self.request_connection(): self.setBusy(False) return self.setBusy(True) # Process episode actions received from gpodder.net def merge_proc(self): self.startProgress.emit(_('Merging episode actions...')) def find_episode(podcast_url, episode_url, counter): counter['x'] += 1 self.startProgress.emit(_('Merging episode actions (%d)') % counter['x']) return self.find_episode(podcast_url, episode_url) try: d = {'x': 0} # Used to "remember" the counter inside find_episode self.root.mygpo_client.process_episode_actions(lambda x, y: find_episode(x, y, d)) finally: self.endProgress.emit() util.run_in_background(lambda: merge_proc(self)) for podcast in self.root.podcast_model.get_objects(): if not podcast.pause_subscription and not podcast.qupdating: if podcast.qtitle != 'All episodes': self.updating_podcasts += 1 podcast.qupdate(finished_callback=self.finished_update) self.setBusy(self.updating_podcasts > 0) def request_connection(self): """Request an internet connection Returns True if a connection is available, False otherwise """ if not util.connection_available(): # TODO: Try to request the network connection dialog, and wait # for a connection - if a connection is available, return True self.showMessage.emit('\n\n'.join((_('No network connection'), _('Please connect to a network, then try again.')))) return False return True @Slot(int) def contextMenuResponse(self, index): assert index < len(self.context_menu_actions) action = self.context_menu_actions[index] if action.action == 'update': podcast = action.target self.updatePodcast(podcast) elif action.action == 'force-update': action.target.qupdate(force=True, \ finished_callback=self.update_subset_stats) elif action.action == 'update-all': self.updateAllPodcasts() elif action.action == 'force-update-all': for podcast in self.root.podcast_model.get_objects(): podcast.qupdate(force=True, finished_callback=self.update_subset_stats) if action.action == 'unsubscribe': def unsubscribe(): action.target.remove_downloaded() action.target.delete() # Remove queued episodes for this specific podcast self.removeQueuedEpisodesForPodcast.emit(action.target) # Update statistics in "All episodes" self.update_subset_stats() self.root.podcast_model.remove_object(action.target) self.root.mygpo_client.on_unsubscribe([action.target.url]) self.root.mygpo_client.flush() self.confirm_action(_('Remove this podcast and episodes?'), _('Unsubscribe'), unsubscribe) elif action.action == 'episode-toggle-new': action.target.toggle_new() self.episodeUpdated.emit(action.target.id) self.update_subset_stats() elif action.action == 'episode-toggle-archive': action.target.toggle_archive() self.episodeUpdated.emit(action.target.id) self.update_subset_stats() elif action.action == 'episode-delete': self.deleteEpisode(action.target) elif action.action == 'episode-enqueue': self.enqueueEpisode.emit(action.target) elif action.action == 'mark-as-read': for episode in action.target.get_all_episodes(): if not episode.was_downloaded(and_exists=True): episode.mark(is_played=True) action.target.changed.emit() self.update_subset_stats() elif action.action == 'change-section': def section_changer(podcast): section = yield (_('New section name:'), podcast.section, _('Rename'), _('Cancel'), True) if section and section != podcast.section: podcast.set_section(section) self.root.resort_podcast_list() self.start_input_dialog(section_changer(action.target)) elif action.action == 'rename-podcast': def title_changer(podcast): title = yield (_('New name:'), podcast.title, _('Rename'), _('Cancel'), True) if title and title != podcast.title: podcast.rename(title) self.root.resort_podcast_list() self.start_input_dialog(title_changer(action.target)) def confirm_action(self, message, affirmative, callback, negative_callback=None): def confirm(message, affirmative, callback, negative_callback): args = (message, '', affirmative, _('Cancel'), False) if (yield args): callback() elif negative_callback is not None: negative_callback() self.start_input_dialog(confirm(message, affirmative, callback, negative_callback)) def start_input_dialog(self, generator): """Carry out an input dialog with the UI This function takes a generator function as argument which should yield a tuple of arguments for the showInputDialog signal. The generator will receive the user's response as a result of the yield expression. If the user accepted the dialog, a string is returned (the value that has been input), otherwise None is returned. Example usage: def some_function(): result = yield ('A simple message', 'default value') if result is None: # user has rejected the dialog else: # user has accepted, new value in "result" start_input_dialog(some_function()) """ assert self.current_input_dialog is None self.current_input_dialog = generator args = generator.next() self.showInputDialog.emit(*args) @Slot(bool, str, bool) def inputDialogResponse(self, accepted, value, is_text): if not is_text: value = accepted elif not accepted: value = None try: self.current_input_dialog.send(value) except StopIteration: # This is expected, as the generator # should only have one yield statement pass self.current_input_dialog = None @Slot(QObject) def downloadEpisode(self, episode): episode.qdownload(self.root.config, self.update_subset_stats, self.episodeUpdated.emit) self.root.mygpo_client.on_download([episode]) self.root.mygpo_client.flush() @Slot(QObject) def cancelDownload(self, episode): episode.download_task.cancel() episode.download_task.removed_from_list() self.episodeUpdated.emit(episode.id) @Slot(QObject) def deleteEpisode(self, episode): def delete(): episode.delete_episode() self.episodeUpdated.emit(episode.id) self.update_subset_stats() self.root.mygpo_client.on_delete([episode]) self.root.mygpo_client.flush() self.removeQueuedEpisode.emit(episode) util.run_in_background(self.root.episode_model.sort) self.confirm_action(_('Delete this episode?'), _('Delete'), delete) @Slot(QObject) def acquireEpisode(self, episode): self.root.add_active_episode(episode) @Slot(QObject) def releaseEpisode(self, episode): self.root.remove_active_episode(episode) @Slot() def contextMenuClosed(self): self.context_menu_actions = [] @Slot(QObject) def episodeContextMenu(self, episode): menu = [] toggle_new = _('Mark as old') if episode.is_new else _('Mark as new') menu.append(helper.Action(toggle_new, 'episode-toggle-new', episode)) toggle_archive = _('Allow deletion') if episode.archive else _('Archive') menu.append(helper.Action(toggle_archive, 'episode-toggle-archive', episode)) if episode.state != gpodder.STATE_DELETED: menu.append(helper.Action(_('Delete'), 'episode-delete', episode)) menu.append(helper.Action(_('Add to play queue'), 'episode-enqueue', episode)) self.show_context_menu(menu) @Slot('QVariant') def addSubscriptions(self, urls): if self._subscribe_in_progress: logger.warn('addSubscriptions call ignored (already subscribing)') return self._subscribe_in_progress = True def not_yet_subscribed(url): if not url: return False for podcast in self.root.podcast_model.get_objects(): if isinstance(podcast, model.EpisodeSubsetView): continue if podcast.url == url: logger.info('Already subscribed: %s', url) return False return True urls = filter(not_yet_subscribed, map(util.normalize_feed_url, urls)) @util.run_in_background def subscribe_proc(): self.startProgress.emit(_('Adding podcasts...')) failed = [] try: for idx, url in enumerate(urls): self.startProgress.emit(_('Adding podcasts...') + ' (%d/%d)' % (idx, len(urls))) try: podcast = self.root.model.load_podcast(url=url, create=True, max_episodes=self.root.config.max_episodes_per_feed) podcast.save() self.root.insert_podcast(model.QPodcast(podcast)) except Exception, e: logger.warn('Cannot add podcast: %s', url, exc_info=True) failed.append((url, str(e))) finally: self.endProgress.emit() self._subscribe_in_progress = False self.update_subset_stats() def format_error(failed): yield _('Could not add some podcasts:') yield '' for url, error in failed: yield ': '.join((url, error)) if error else url if failed: self.showMessage.emit('\n'.join(format_error(failed))) @Slot(QObject) def currentEpisodeChanging(self, episode): if self.current_episode is not None: self.current_episode.save() self.current_episode = episode def on_quit(self): # Make sure the audio playback is stopped immediately self.shutdown.emit() # Save current episode if self.current_episode is not None: self.current_episode.save() class gPodderListModel(QAbstractListModel): def __init__(self, objects=None): QAbstractListModel.__init__(self) if objects is None: objects = [] self._objects = objects self.setRoleNames({0: 'modelData', 1: 'section'}) def sort(self): # Unimplemented for the generic list model self.reset() def insert_object(self, o): self._objects.append(o) self.sort() def remove_object(self, o): self._objects.remove(o) self.reset() def set_objects(self, objects): self._objects = objects self.sort() def get_objects(self): return self._objects def get_object(self, index): return self._objects[index.row()] def rowCount(self, parent=QModelIndex()): return len(self.get_objects()) def data(self, index, role): if index.isValid(): if role == 0: return self.get_object(index) elif role == 1: return self.get_object(index).qsection return None class gPodderPodcastListModel(gPodderListModel): def set_podcasts(self, db, podcasts): views = [ model.EpisodeSubsetView(db, self, _('All episodes'), ''), ] self.set_objects(views + podcasts) def get_podcasts(self): return filter(lambda podcast: isinstance(podcast, model.QPodcast), self.get_objects()) def sort(self): self._objects = sorted(self._objects, key=model.QPodcast.sort_key) self.reset() class gPodderEpisodeListModel(gPodderListModel): def __init__(self, config, root): gPodderListModel.__init__(self) self._filter = config.ui.qml.state.episode_list_filter self._filtered = [] self._processed = [] self._is_subset_view = False self._config = config self._root = root config.add_observer(self._on_config_changed) is_subset_view_changed = Signal() def get_is_subset_view(self): return self._is_subset_view def set_is_subset_view(self, is_subset_view): if is_subset_view != self.is_subset_view: self._is_subset_view = is_subset_view self.is_subset_view_changed.emit() is_subset_view = Property(bool, get_is_subset_view, set_is_subset_view, notify=is_subset_view_changed) def _on_config_changed(self, name, old_value, new_value): if name == 'ui.qml.state.episode_list_filter': self._filter = new_value util.run_in_background(self.sort) def sort(self): self._root.controller.clearEpisodeListModel.emit() caption, eql = EPISODE_LIST_FILTERS[self._filter] if eql is None: self._filtered = self._objects else: eql = query.EQL(eql) match = lambda episode: eql.match(episode._episode) self._filtered = filter(match, self._objects) def to_dict(episode): return { 'episode_id': episode._episode.id, 'episode': episode, 'title': episode.qtitle, 'podcast': episode.qpodcast, 'cover_url': episode.qpodcast.qcoverart, 'filetype': episode.qfiletype, 'duration': episode.qduration, 'downloading': episode.qdownloading, 'position': episode.qposition, 'progress': episode.qprogress, 'downloaded': episode.qdownloaded, 'isnew': episode.qnew, 'archive': episode.qarchive, } self._processed = map(to_dict, self._filtered[:EPISODE_LIST_LIMIT]) self.reset() self._root.controller.setEpisodeListModel.emit() def get_objects(self): return self._processed def get_object(self, index): return self._processed[index.row()] @Slot(int, result='QVariant') def get_object_by_index(self, index): return self._processed[int(index)] @Slot(int, result='QVariant') def get_object_by_index(self, index): return self._processed[int(index)] @Slot(result=int) def getCount(self): return len(self._processed) @Slot(result=int) def getFilter(self): return self._filter @Slot(int) def setFilter(self, filter_index): self._config.ui.qml.state.episode_list_filter = filter_index def QML(filename): for folder in gpodder.ui_folders: filename = os.path.join(folder, filename) if os.path.exists(filename): return filename import time class DeclarativeView(QDeclarativeView): def __init__(self): QDeclarativeView.__init__(self) self.setAttribute(Qt.WA_OpaquePaintEvent) self.setAttribute(Qt.WA_NoSystemBackground) self.viewport().setAttribute(Qt.WA_OpaquePaintEvent) self.viewport().setAttribute(Qt.WA_NoSystemBackground) # def paintEvent(self, event): # old = time.time() # QDeclarativeView.paintEvent(self, event) # fps = 1. / (time.time() - old) # if fps < 60: # print 'FPS: %2.0f' % fps closing = Signal() def closeEvent(self, event): self.closing.emit() event.ignore() class qtPodder(QObject): def __init__(self, args, gpodder_core, dbus_bus_name): QObject.__init__(self) self.dbus_bus_name = dbus_bus_name # TODO: Expose the same D-Bus API as the Gtk UI D-Bus object (/gui) # TODO: Create a gpodder.dbusproxy.DBusPodcastsProxy object (/podcasts) self.app = QApplication(args) signal.signal(signal.SIGINT, signal.SIG_DFL) self.quit.connect(self.on_quit) self.core = gpodder_core self.config = self.core.config self.db = self.core.db self.model = self.core.model self.config_proxy = ConfigProxy(self.config) # Initialize the gpodder.net client self.mygpo_client = my.MygPoClient(self.config) gpodder.user_extensions.on_ui_initialized(self.model, self.extensions_podcast_update_cb, self.extensions_episode_download_cb) self.view = DeclarativeView() self.view.closing.connect(self.on_quit) self.view.setResizeMode(QDeclarativeView.SizeRootObjectToView) self.controller = Controller(self) self.media_buttons_handler = helper.MediaButtonsHandler() self.tracker_miner_config = helper.TrackerMinerConfig() self.podcast_model = gPodderPodcastListModel() self.episode_model = gPodderEpisodeListModel(self.config, self) self.last_episode = None # A dictionary of episodes that are currently active # in some way (i.e. playing back or downloading) self.active_episode_wrappers = {} engine = self.view.engine() # Add the cover art image provider self.cover_provider = images.LocalCachedImageProvider() engine.addImageProvider('cover', self.cover_provider) root_context = self.view.rootContext() root_context.setContextProperty('controller', self.controller) root_context.setContextProperty('configProxy', self.config_proxy) root_context.setContextProperty('mediaButtonsHandler', self.media_buttons_handler) root_context.setContextProperty('trackerMinerConfig', self.tracker_miner_config) root_context.setContextProperty('podcastModel', self.podcast_model) root_context.setContextProperty('episodeModel', self.episode_model) root_context.setContextProperty('isSailfish', gpodder.ui.sailfish) for folder in gpodder.ui_folders: if gpodder.ui.sailfish: path = os.path.join(folder, 'sailfish') else: path = os.path.join(folder, 'harmattan') if os.path.exists(path): logger.info('Adding QML Import Path: %s', path) engine.addImportPath(path) # Load the QML UI (this could take a while...) self.view.setSource(QUrl.fromLocalFile(QML('main_default.qml'))) self.view.setWindowTitle('gPodder') if gpodder.ui.harmattan or gpodder.ui.sailfish: self.view.showFullScreen() else: # On the Desktop, scale to fit my small laptop screen.. desktop = self.app.desktop() if desktop.height() < 1000: FACTOR = .8 self.view.scale(FACTOR, FACTOR) size = self.view.size() size *= FACTOR self.view.resize(size) self.view.show() podcasts = self.load_podcasts() self.resumable_episodes = None self.do_offer_download_resume.connect(self.on_offer_download_resume) util.run_in_background(self.find_partial_downloads(podcasts)) def find_partial_downloads(self, podcasts): def start_progress_callback(count): self.controller.startProgress.emit(_('Loading incomplete downloads')) def progress_callback(title, progress): self.controller.startProgress.emit('%s (%d%%)' % ( _('Loading incomplete downloads'), progress*100)) def finish_progress_callback(resumable_episodes): self.controller.endProgress.emit() self.resumable_episodes = resumable_episodes self.do_offer_download_resume.emit() common.find_partial_downloads(podcasts, start_progress_callback, progress_callback, finish_progress_callback) do_offer_download_resume = Signal() def on_offer_download_resume(self): if self.resumable_episodes: def download_episodes(): for episode in self.resumable_episodes: qepisode = self.wrap_simple_episode(episode) self.controller.downloadEpisode(qepisode) def delete_episodes(): logger.debug('Deleting incomplete downloads.') common.clean_up_downloads(delete_partial=True) message = _('Incomplete downloads from a previous session were found.') title = _('Resume') self.controller.confirm_action(message, title, download_episodes, delete_episodes) def add_active_episode(self, episode): self.active_episode_wrappers[episode.id] = episode episode.episode_wrapper_refcount += 1 def remove_active_episode(self, episode): episode.episode_wrapper_refcount -= 1 if episode.episode_wrapper_refcount == 0: del self.active_episode_wrappers[episode.id] def load_last_episode(self): last_episode = None last_podcast = None for podcast in self.podcast_model.get_podcasts(): for episode in podcast.get_all_episodes(): if not episode.last_playback: continue if last_episode is None or \ episode.last_playback > last_episode.last_playback: last_episode = episode last_podcast = podcast if last_episode is not None: self.last_episode = self.wrap_episode(last_podcast, last_episode) # FIXME: Send last episode to player #self.select_episode(self.last_episode) def run(self): return self.app.exec_() quit = Signal() def on_quit(self): self.controller.on_quit() self.view.hide() self.core.shutdown() self.app.quit() def resort_podcast_list(self): self.podcast_model.sort() def insert_podcast(self, podcast): self.podcast_model.insert_object(podcast) self.mygpo_client.on_subscribe([podcast.url]) self.mygpo_client.flush() def load_podcasts(self): podcasts = map(model.QPodcast, self.model.get_podcasts()) self.podcast_model.set_podcasts(self.db, podcasts) return podcasts def wrap_episode(self, podcast, episode): try: return self.active_episode_wrappers[episode.id] except KeyError: return model.QEpisode(self, podcast, episode) def wrap_simple_episode(self, episode): for podcast in self.podcast_model.get_podcasts(): if podcast.id == episode.podcast_id: return self.wrap_episode(podcast, episode) return None def select_podcast(self, podcast): if isinstance(podcast, model.QPodcast): # Normal QPodcast instance wrap = functools.partial(self.wrap_episode, podcast) objects = podcast.get_all_episodes() self.episode_model.set_is_subset_view(False) else: # EpisodeSubsetView wrap = lambda args: self.wrap_episode(*args) objects = podcast.get_all_episodes_with_podcast() self.episode_model.set_is_subset_view(True) self.episode_model.set_objects(map(wrap, objects)) def podcast_to_qpodcast(self, podcast): podcasts = filter(lambda p: p._podcast == podcast, self.podcast_model.get_podcasts()) assert len(podcasts) <= 1 if podcasts: return podcasts[0] return None def extensions_podcast_update_cb(self, podcast): logger.debug('extensions_podcast_update_cb(%s)', podcast) try: qpodcast = self.podcast_to_qpodcast(podcast) if qpodcast is not None and not qpodcast.pause_subscription: qpodcast.qupdate( finished_callback=self.controller.update_subset_stats) except Exception, e: logger.exception('extensions_podcast_update_cb(%s): %s', podcast, e) def extensions_episode_download_cb(self, episode): logger.debug('extensions_episode_download_cb(%s)', episode) try: qpodcast = self.podcast_to_qpodcast(episode.channel) qepisode = self.wrap_episode(qpodcast, episode) self.controller.downloadEpisode(qepisode) except Exception, e: logger.exception('extensions_episode_download_cb(%s): %s', episode, e) def main(args): try: dbus_main_loop = DBusGMainLoop(set_as_default=True) gpodder.dbus_session_bus = dbus.SessionBus(dbus_main_loop) bus_name = dbus.service.BusName(gpodder.dbus_bus_name, bus=gpodder.dbus_session_bus) except dbus.exceptions.DBusException, dbe: logger.warn('Cannot get "on the bus".', exc_info=True) bus_name = None gui = qtPodder(args, core.Core(), bus_name) return gui.run() gpodder-3.5.2/src/gpodder/qmlui/helper.py0000644000175000017500000001163012220076757017761 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import gpodder import os from gpodder import util from PySide import QtCore import logging logger = logging.getLogger(__name__) class Action(QtCore.QObject): def __init__(self, caption, action, target=None): QtCore.QObject.__init__(self) self._caption = util.convert_bytes(caption) self.action = action self.target = target changed = QtCore.Signal() def _get_caption(self): return self._caption caption = QtCore.Property(unicode, _get_caption, notify=changed) class MediaButtonsHandler(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) if gpodder.ui.harmattan: headset_path = '/org/freedesktop/Hal/devices/computer_logicaldev_input_0' headset_path2 = '/org/freedesktop/Hal/devices/computer_logicaldev_input' else: return import dbus system_bus = dbus.SystemBus() system_bus.add_signal_receiver(self.handle_button, 'Condition', 'org.freedesktop.Hal.Device', None, headset_path) if gpodder.ui.harmattan: system_bus.add_signal_receiver(self.handle_button, 'Condition', 'org.freedesktop.Hal.Device', None, headset_path2) def handle_button(self, signal, button): if signal == 'ButtonPressed': if button in ('play-cd', 'phone'): self.playPressed.emit() elif button == 'pause-cd': self.pausePressed.emit() elif button == 'previous-song': self.previousPressed.emit() elif button == 'next-song': self.nextPressed.emit() playPressed = QtCore.Signal() pausePressed = QtCore.Signal() previousPressed = QtCore.Signal() nextPressed = QtCore.Signal() class TrackerMinerConfig(QtCore.QObject): FILENAME = os.path.expanduser('~/.config/tracker/tracker-miner-fs.cfg') SECTION = 'IgnoredDirectories' ENTRY = '$HOME/MyDocs/gPodder/' def __init__(self, filename=None): QtCore.QObject.__init__(self) self._filename = filename or TrackerMinerConfig.FILENAME self._index_podcasts = self.get_index_podcasts() @QtCore.Slot(result=bool) def get_index_podcasts(self): """ Returns True if the gPodder directory is indexed, False otherwise """ if not os.path.exists(self._filename): logger.warn('File does not exist: %s', self._filename) return False for line in open(self._filename, 'r'): if line.startswith(TrackerMinerConfig.SECTION + '='): return (TrackerMinerConfig.ENTRY not in line) @QtCore.Slot(bool, result=bool) def set_index_podcasts(self, index_podcasts): """ If index_podcasts is True, make sure the gPodder directory is indexed If index_podcasts is False, ignore the gPodder directory in Tracker """ if not os.path.exists(self._filename): logger.warn('File does not exist: %s', self._filename) return False if self._index_podcasts == index_podcasts: # Nothing to do return True tmp_filename = self._filename + '.gpodder.tmp' out = open(tmp_filename, 'w') for line in open(self._filename, 'r'): if line.startswith(TrackerMinerConfig.SECTION + '='): _, rest = line.rstrip('\n').split('=', 1) directories = filter(None, rest.split(';')) if index_podcasts: if TrackerMinerConfig.ENTRY in directories: directories.remove(TrackerMinerConfig.ENTRY) else: if TrackerMinerConfig.ENTRY not in directories: directories.append(TrackerMinerConfig.ENTRY) line = '%(section)s=%(value)s;\n' % { 'section': TrackerMinerConfig.SECTION, 'value': ';'.join(directories), } logger.info('Writing new config line: %s', line) out.write(line) out.close() os.rename(tmp_filename, self._filename) self._index_podcasts = index_podcasts return True gpodder-3.5.2/src/gpodder/qmlui/images.py0000644000175000017500000000427612220076757017757 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from PySide.QtCore import Qt from PySide.QtGui import QImage from PySide.QtDeclarative import QDeclarativeImageProvider import gpodder from gpodder import util from gpodder import coverart import logging logger = logging.getLogger(__name__) import os import urllib class LocalCachedImageProvider(QDeclarativeImageProvider): IMAGE_TYPE = QDeclarativeImageProvider.ImageType.Image def __init__(self): QDeclarativeImageProvider.__init__(self, self.IMAGE_TYPE) self.downloader = coverart.CoverDownloader() self._cache = {} def requestImage(self, id, size, requestedSize): key = (id, requestedSize) if key in self._cache: return self._cache[key] cover_file, cover_url, podcast_url, podcast_title = id.split('|') def get_filename(): return self.downloader.get_cover(cover_file, cover_url, podcast_url, podcast_title, None, None, True) filename = get_filename() image = QImage() if not image.load(filename): if filename.startswith(cover_file): logger.info('Deleting broken cover art: %s', filename) util.delete_file(filename) image.load(get_filename()) if not image.isNull(): self._cache[key] = image.scaled(requestedSize, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation) return self._cache[key] gpodder-3.5.2/src/gpodder/qmlui/model.py0000644000175000017500000003427512220076757017614 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from PySide.QtCore import QObject, Property, Signal, Slot import gpodder _ = gpodder.gettext import logging logger = logging.getLogger(__name__) from gpodder import model from gpodder import util from gpodder import youtube from gpodder import download from gpodder import query from gpodder import model from gpodder import coverart import os import urllib convert = util.convert_bytes class QEpisode(QObject): def __init__(self, wrapper_manager, podcast, episode): QObject.__init__(self) self._wrapper_manager = wrapper_manager self.episode_wrapper_refcount = 0 self._podcast = podcast self._episode = episode # Caching of YouTube URLs, so we don't need to resolve # it every time we update the podcast item (doh!) # XXX: Maybe do this in the episode of the model already? self._qt_yt_url = None # Download progress tracking XXX: read directy from task self._qt_download_progress = 0 # Playback tracking self._qt_playing = False @Slot(QObject, result=bool) def equals(self, other): """Needed for Python object identity comparison in JavaScript""" return self == other def __getattr__(self, name): logger.warn('Attribute access in %s: %s', self.__class__.__name__, name) return getattr(self._episode, name) def toggle_new(self): self._episode.mark(is_played=self._episode.is_new) self.changed.emit() self._podcast.changed.emit() def toggle_archive(self): self._episode.mark(is_locked=not self._episode.archive) self.changed.emit() self._podcast.changed.emit() def delete_episode(self): self._episode.delete_from_disk() self._episode.mark(is_played=True) self.changed.emit() self._podcast.changed.emit() self.source_url_changed.emit() changed = Signal() never_changed = Signal() source_url_changed = Signal() def _podcast(self): return self._podcast qpodcast = Property(QObject, _podcast, notify=never_changed) def _title(self): return convert(self._episode.trimmed_title) qtitle = Property(unicode, _title, notify=changed) def _sourceurl(self): if self._episode.was_downloaded(and_exists=True): url = self._episode.local_filename(create=False) elif self._qt_yt_url is not None: url = self._qt_yt_url else: url = youtube.get_real_download_url(self._episode.url) self._qt_yt_url = url return convert(url) qsourceurl = Property(unicode, _sourceurl, notify=source_url_changed) def _filetype(self): return self._episode.file_type() or 'download' qfiletype = Property(unicode, _filetype, notify=never_changed) def _pubdate(self): return self._episode.cute_pubdate() qpubdate = Property(unicode, _pubdate, notify=never_changed) def _filesize(self): if self._episode.file_size: return util.format_filesize(self._episode.file_size) else: return '' qfilesize = Property(unicode, _filesize, notify=changed) def _downloaded(self): return self._episode.was_downloaded(and_exists=True) qdownloaded = Property(bool, _downloaded, notify=changed) def _downloading(self): return self._episode.downloading qdownloading = Property(bool, _downloading, notify=changed) def _playing(self): return self._qt_playing def _set_playing(self, playing): if self._qt_playing != playing: if playing: self._episode.playback_mark() self._qt_playing = playing self.changed.emit() qplaying = Property(bool, _playing, _set_playing, notify=changed) def _progress(self): return self._qt_download_progress qprogress = Property(float, _progress, notify=changed) def qdownload(self, config, finished_callback=None, progress_callback=None): # Avoid starting the same download twice if self.download_task is not None: return # Initialize the download task here, so that the # UI will be updated as soon as possible self._wrapper_manager.add_active_episode(self) self._qt_download_progress = 0. task = download.DownloadTask(self._episode, config) task.status = download.DownloadTask.QUEUED self.changed.emit() if progress_callback is not None: progress_callback(self.id) def t(self): def cb(progress): if progress > self._qt_download_progress + .01 or progress == 1: self._qt_download_progress = progress self.changed.emit() if progress_callback is not None: progress_callback(self.id) task.add_progress_callback(cb) task.run() task.recycle() task.removed_from_list() self.source_url_changed.emit() if progress_callback is not None: progress_callback(self.id) # Make sure the single channel is updated (main view) self._podcast.changed.emit() # Make sure that "All episodes", etc.. are updated if finished_callback is not None: finished_callback() self._wrapper_manager.remove_active_episode(self) util.run_in_background(lambda: t(self), True) def _description(self): return convert(self._episode.description_html) qdescription = Property(unicode, _description, notify=changed) def _new(self): return self._episode.is_new qnew = Property(bool, _new, notify=changed) def _archive(self): return self._episode.archive qarchive = Property(bool, _archive, notify=changed) def _position(self): return self._episode.current_position def _set_position(self, position): current_position = int(position) if current_position == 0: return if current_position != self._episode.current_position: self._episode.current_position = current_position self.changed.emit() qposition = Property(int, _position, _set_position, notify=changed) def _duration(self): return self._episode.total_time def _set_duration(self, duration): total_time = int(duration) if total_time != self._episode.total_time: self._episode.total_time = total_time self.changed.emit() qduration = Property(int, _duration, _set_duration, notify=changed) class QPodcast(QObject): def __init__(self, podcast): QObject.__init__(self) self._podcast = podcast self._updating = False @Slot(QObject, result=bool) def equals(self, other): """Needed for Python object identity comparison in JavaScript""" return self == other @classmethod def sort_key(cls, qpodcast): if isinstance(qpodcast, cls): sortkey = model.Model.podcast_sort_key(qpodcast._podcast) else: sortkey = None return (qpodcast.qsection, sortkey) def __getattr__(self, name): logger.warn('Attribute access in %s: %s', self.__class__.__name__, name) return getattr(self._podcast, name) def qupdate(self, force=False, finished_callback=None): if self._updating: # Update in progress - just wait, don't re-update return def t(self): self._updating = True self.changed.emit() if force: self._podcast.http_etag = None self._podcast.http_last_modified = None try: self._podcast.update() except Exception, e: # XXX: Handle exception (error message)! pass self._updating = False self.changed.emit() # Notify the caller that we've finished updating if finished_callback is not None: finished_callback() util.run_in_background(lambda: t(self)) changed = Signal() def _updating(self): return self._updating qupdating = Property(bool, _updating, notify=changed) def _title(self): return convert(self._podcast.title) qtitle = Property(unicode, _title, notify=changed) def _url(self): return convert(self._podcast.url) qurl = Property(unicode, _url, notify=changed) def _coverfile(self): return convert(self._podcast.cover_file) qcoverfile = Property(unicode, _coverfile, notify=changed) def _coverurl(self): return convert(self._podcast.cover_url) qcoverurl = Property(unicode, _coverurl, notify=changed) def _coverart(self): quote = lambda x: convert(x) if x else u'' return convert(u'image://cover/%s|%s|%s|%s' % ( quote(self._podcast.cover_file), quote(self._podcast.cover_url), quote(self._podcast.url), quote(self._podcast.title), )) qcoverart = Property(unicode, _coverart, notify=changed) def _downloaded(self): return self._podcast.get_statistics()[3] qdownloaded = Property(int, _downloaded, notify=changed) def _new(self): return self._podcast.get_statistics()[2] qnew = Property(int, _new, notify=changed) def _description(self): return convert(util.get_first_line(self._podcast.description)) qdescription = Property(unicode, _description, notify=changed) def _section(self): return convert(self._podcast.group_by) qsection = Property(unicode, _section, notify=changed) def set_section(self, section): self._podcast.section = section self._podcast.save() self.changed.emit() class EpisodeSubsetView(QObject): def __init__(self, db, podcast_list_model, title, description, eql=None): QObject.__init__(self) self.db = db self.podcast_list_model = podcast_list_model self.title = title self.description = description self.eql = eql self.pause_subscription = False self._new_count = -1 self._downloaded_count = -1 def _update_stats(self): if self.eql is None: total, deleted, new, downloaded, unplayed = \ self.db.get_podcast_statistics() else: new, downloaded = 0, 0 for episode in self.get_all_episodes(): if episode.was_downloaded(and_exists=True): downloaded += 1 elif episode.is_new: new += 1 self._new_count = new self._downloaded_count = downloaded def _do_filter(self, items, is_tuple=False): """Filter a list of items via the attached SQL If is_tuple is True, the list of items should be a list of (podcast, episode) tuples, otherwise it should just be a list of episode objects. """ if self.eql is not None: eql = query.EQL(self.eql) if is_tuple: match = lambda (podcast, episode): eql.match(episode) else: match = eql.match items = filter(match, items) return items def get_all_episodes_with_podcast(self): episodes = [(podcast, episode) for podcast in self.podcast_list_model.get_podcasts() for episode in podcast.get_all_episodes()] def sort_key(pair): podcast, episode = pair return model.Model.episode_sort_key(episode) return sorted(self._do_filter(episodes, is_tuple=True), key=sort_key, reverse=True) def get_all_episodes(self): episodes = [] for podcast in self.podcast_list_model.get_podcasts(): episodes.extend(podcast.get_all_episodes()) return model.Model.sort_episodes_by_pubdate( self._do_filter(episodes), True) def qupdate(self, force=False, finished_callback=None): self._update_stats() self.changed.emit() changed = Signal() def _return_false(self): return False def _return_empty(self): return convert('') def _return_cover(self): return convert(coverart.CoverDownloader.ALL_EPISODES_ID) qupdating = Property(bool, _return_false, notify=changed) qurl = Property(unicode, _return_empty, notify=changed) qcoverfile = Property(unicode, _return_cover, notify=changed) qcoverurl = Property(unicode, _return_empty, notify=changed) qsection = Property(unicode, _return_empty, notify=changed) def _coverart(self): quote = lambda x: convert(x) if x else u'' return convert(u'image://cover/%s|%s|%s|%s' % ( quote(coverart.CoverDownloader.ALL_EPISODES_ID), u'', u'', quote(self.title), )) qcoverart = Property(unicode, _coverart, notify=changed) def _title(self): return convert(self.title) qtitle = Property(unicode, _title, notify=changed) def _description(self): return convert(self.description) qdescription = Property(unicode, _description, notify=changed) def _downloaded(self): if self._downloaded_count == -1: self._update_stats() return self._downloaded_count qdownloaded = Property(int, _downloaded, notify=changed) def _new(self): if self._new_count == -1: self._update_stats() return self._new_count qnew = Property(int, _new, notify=changed) gpodder-3.5.2/src/gpodder/test/0000755000175000017500000000000012220346122015741 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/test/__init__.py0000644000175000017500000000137312220076757020074 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # gpodder-3.5.2/src/gpodder/test/model.py0000644000175000017500000000330712220076757017434 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.test.model - Unit tests for gpodder.model # Thomas Perl ; 2013-02-12 import unittest import gpodder from gpodder import model class TestEpisodePublishedProperties(unittest.TestCase): PUBLISHED_UNIXTIME = 1360666744 PUBLISHED_SORT = '2013-02-12' PUBLISHED_YEAR = '13' PUBLISHED_MONTH = '02' PUBLISHED_DAY = '12' def setUp(self): self.podcast = model.PodcastChannel(None) self.episode = model.PodcastEpisode(self.podcast) self.episode.published = self.PUBLISHED_UNIXTIME def test_sortdate(self): self.assertEqual(self.episode.sortdate, self.PUBLISHED_SORT) def test_pubdate_year(self): self.assertEqual(self.episode.pubdate_year, self.PUBLISHED_YEAR) def test_pubdate_month(self): self.assertEqual(self.episode.pubdate_month, self.PUBLISHED_MONTH) def test_pubdate_day(self): self.assertEqual(self.episode.pubdate_day, self.PUBLISHED_DAY) gpodder-3.5.2/src/gpodder/webui/0000755000175000017500000000000012220346122016075 5ustar thpthp00000000000000gpodder-3.5.2/src/gpodder/webui/__init__.py0000644000175000017500000000751412220076757020233 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.webui - The basis for a gPodder Web UI # Thomas Perl ; 2011-02-12 import gpodder from gpodder import core from gpodder import model from gpodder import util import BaseHTTPServer try: # For Python < 2.6, we use the "simplejson" add-on module import simplejson as json except ImportError: # Python 2.6 already ships with a nice "json" module import json import os import re import sys def to_json(o): return dict((key, getattr(o, key)) for key in o.__slots__ + ('id',)) def json_response(path_parts): core = WebUI.core if path_parts == ['podcasts.json']: return map(to_json, core.model.get_podcasts()) elif (len(path_parts) == 3 and path_parts[0] == 'podcast' and path_parts[2] == 'episodes.json'): podcast_id = int(path_parts[1]) for podcast in core.model.get_podcasts(): if podcast.id == podcast_id: return map(to_json, podcast.get_all_episodes()) return None class WebUI(BaseHTTPServer.BaseHTTPRequestHandler): STATIC_PATH = os.path.join(gpodder.prefix, 'share', 'gpodder', 'ui', 'web') DEFAULT_PORT = 8086 core = None @classmethod def run(cls, only_localhost=True, server_class=BaseHTTPServer.HTTPServer): if only_localhost: server_address = ('localhost', cls.DEFAULT_PORT) else: server_address = ('', cls.DEFAULT_PORT) print >>sys.stderr, """ Server running. Point your web browser to: http://localhost:%s/ Press Ctrl+C to stop the web server. """ % (cls.DEFAULT_PORT,) httpd = server_class(server_address, cls) try: httpd.serve_forever() except KeyboardInterrupt: del httpd def do_GET(self): if self.path == '/': self.path = '/static/index.html' path_parts = filter(None, self.path.split('/'))[1:] if '..' not in path_parts: if self.path.startswith('/static/'): filename = os.path.join(self.STATIC_PATH, *path_parts) _, extension = os.path.splitext(filename) mimetype = util.mimetype_from_extension(extension) self.send_response(200) self.send_header('Content-type', mimetype) self.end_headers() self.wfile.write(open(filename).read()) self.wfile.close() return elif self.path.startswith('/json/'): data = json_response(path_parts) if data is not None: self.send_response(200) self.send_header('Content-type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data)) self.wfile.close() return self.send_response(400) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write('

      Invalid request

      ') self.wfile.close() def main(only_localhost=True, core=None): WebUI.core = core return WebUI.run(only_localhost) gpodder-3.5.2/src/gpodder/__init__.py0000644000175000017500000001425712220345405017107 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # This metadata block gets parsed by setup.py - use single quotes only __tagline__ = 'Media aggregator and podcast client' __author__ = 'Thomas Perl ' __version__ = '3.5.2' __date__ = '2013-10-24' __relname__ = 'The Prime Mover' __copyright__ = '© 2005-2013 Thomas Perl and the gPodder Team' __license__ = 'GNU General Public License, version 3 or later' __url__ = 'http://gpodder.org/' __version_info__ = tuple(int(x) for x in __version__.split('.')) import os import sys import platform import gettext import locale # Check if real hard dependencies are available try: import feedparser except ImportError: print """ Error: Module "feedparser" (python-feedparser) not found. The feedparser module can be downloaded from http://code.google.com/p/feedparser/ """ sys.exit(1) del feedparser try: import mygpoclient except ImportError: print """ Error: Module "mygpoclient" (python-mygpoclient) not found. The mygpoclient module can be downloaded from http://thp.io/2010/mygpoclient/ """ sys.exit(1) del mygpoclient try: import sqlite3 except ImportError: print """ Error: Module "sqlite3" not found. Build Python with SQLite 3 support or get it from http://code.google.com/p/pysqlite/ """ sys.exit(1) del sqlite3 # The User-Agent string for downloads user_agent = 'gPodder/%s (+%s)' % (__version__, __url__) # Are we running in GUI, MeeGo 1.2 Harmattan or console mode? class UI(object): def __init__(self): self.harmattan = False self.sailfish = False self.gtk = False self.qml = False self.cli = False ui = UI() # D-Bus specific interface names dbus_bus_name = 'org.gpodder' dbus_gui_object_path = '/gui' dbus_podcasts_object_path = '/podcasts' dbus_interface = 'org.gpodder.interface' dbus_podcasts = 'org.gpodder.podcasts' dbus_session_bus = None # Set "win32" to True if we are on Windows ui.win32 = (platform.system() == 'Windows') # Set "osx" to True if we are on Mac OS X ui.osx = (platform.system() == 'Darwin') # i18n setup (will result in "gettext" to be available) # Use _ = gpodder.gettext in modules to enable string translations textdomain = 'gpodder' locale_dir = gettext.bindtextdomain(textdomain) t = gettext.translation(textdomain, locale_dir, fallback=True) try: # Python 2 gettext = t.ugettext ngettext = t.ungettext except AttributeError: # Python 3 gettext = t.gettext ngettext = t.ngettext if ui.win32: try: # Workaround for bug 650 from gtk.glade import bindtextdomain bindtextdomain(textdomain, locale_dir) del bindtextdomain except: # Ignore for QML UI or missing glade module pass del t # Set up textdomain for gtk.Builder (this accesses the C library functions) if hasattr(locale, 'bindtextdomain'): locale.bindtextdomain(textdomain, locale_dir) del locale_dir # Set up socket timeouts to fix bug 174 SOCKET_TIMEOUT = 60 import socket socket.setdefaulttimeout(SOCKET_TIMEOUT) del socket del SOCKET_TIMEOUT # Variables reserved for GUI-specific use (will be set accordingly) ui_folders = [] credits_file = None icon_file = None images_folder = None user_extensions = None # Episode states used in the database STATE_NORMAL, STATE_DOWNLOADED, STATE_DELETED = range(3) # Paths (gPodder's home folder, config, db, download and data prefix) home = None config_file = None database_file = None downloads = None prefix = None ENV_HOME, ENV_DOWNLOADS = 'GPODDER_HOME', 'GPODDER_DOWNLOAD_DIR' # Function to set a new gPodder home folder def set_home(new_home): global home, config_file, database_file, downloads home = os.path.abspath(new_home) config_file = os.path.join(home, 'Settings.json') database_file = os.path.join(home, 'Database') if ENV_DOWNLOADS not in os.environ: downloads = os.path.join(home, 'Downloads') # Default locations for configuration and data files default_home = os.path.expanduser(os.path.join('~', 'gPodder')) set_home(os.environ.get(ENV_HOME, default_home)) if home != default_home: print >>sys.stderr, 'Storing data in', home, '(GPODDER_HOME is set)' if ENV_DOWNLOADS in os.environ: # Allow to relocate the downloads folder (pull request 4, bug 466) downloads = os.environ[ENV_DOWNLOADS] print >>sys.stderr, 'Storing downloads in %s (%s is set)' % (downloads, ENV_DOWNLOADS) # Plugins to load by default DEFAULT_PLUGINS = [ 'gpodder.plugins.soundcloud', 'gpodder.plugins.xspf', ] def load_plugins(): """Load (non-essential) plugin modules This loads a default set of plugins, but you can use the environment variable "GPODDER_PLUGINS" to modify the list of plugins.""" PLUGINS = os.environ.get('GPODDER_PLUGINS', None) if PLUGINS is None: PLUGINS = DEFAULT_PLUGINS else: PLUGINS = PLUGINS.split() for plugin in PLUGINS: try: __import__(plugin) except Exception, e: print >>sys.stderr, 'Cannot load plugin: %s (%s)' % (plugin, e) def detect_platform(): global ui try: etc_issue = open('/etc/issue').read() except Exception, e: etc_issue = '' ui.harmattan = ('MeeGo 1.2 Harmattan' in etc_issue) ui.sailfish = ('Mer release' in etc_issue) if ui.harmattan and ENV_HOME not in os.environ: new_home = os.path.expanduser(os.path.join('~', 'MyDocs', 'gPodder')) set_home(os.path.expanduser(new_home)) gpodder-3.5.2/src/gpodder/common.py0000644000175000017500000001125412220076757016645 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.common - Common helper functions for all UIs # Thomas Perl ; 2012-08-16 import gpodder from gpodder import util import glob import os import logging logger = logging.getLogger(__name__) def clean_up_downloads(delete_partial=False): """Clean up temporary files left behind by old gPodder versions delete_partial - If True, also delete in-progress downloads """ temporary_files = glob.glob('%s/*/.tmp-*' % gpodder.downloads) if delete_partial: temporary_files += glob.glob('%s/*/*.partial' % gpodder.downloads) for tempfile in temporary_files: util.delete_file(tempfile) def find_partial_downloads(channels, start_progress_callback, progress_callback, finish_progress_callback): """Find partial downloads and match them with episodes channels - A list of all model.PodcastChannel objects start_progress_callback - A callback(count) when partial files are searched progress_callback - A callback(title, progress) when an episode was found finish_progress_callback - A callback(resumable_episodes) when finished """ # Look for partial file downloads partial_files = glob.glob(os.path.join(gpodder.downloads, '*', '*.partial')) count = len(partial_files) resumable_episodes = [] if count: start_progress_callback(count) candidates = [f[:-len('.partial')] for f in partial_files] found = 0 for channel in channels: for episode in channel.get_all_episodes(): filename = episode.local_filename(create=False, check_only=True) if filename in candidates: found += 1 progress_callback(episode.title, float(found)/count) candidates.remove(filename) partial_files.remove(filename+'.partial') if os.path.exists(filename): # The file has already been downloaded; # remove the leftover partial file util.delete_file(filename+'.partial') else: resumable_episodes.append(episode) if not candidates: break if not candidates: break for f in partial_files: logger.warn('Partial file without episode: %s', f) util.delete_file(f) finish_progress_callback(resumable_episodes) else: clean_up_downloads(True) def get_expired_episodes(channels, config): for channel in channels: for index, episode in enumerate(channel.get_episodes(gpodder.STATE_DOWNLOADED)): # Never consider archived episodes as old if episode.archive: continue # Download strategy "Only keep latest" if (channel.download_strategy == channel.STRATEGY_LATEST and index > 0): logger.info('Removing episode (only keep latest strategy): %s', episode.title) yield episode continue # Only expire episodes if the age in days is positive if config.episode_old_age < 1: continue # Never consider fresh episodes as old if episode.age_in_days() < config.episode_old_age: continue # Do not delete played episodes (except if configured) if not episode.is_new: if not config.auto_remove_played_episodes: continue # Do not delete unfinished episodes (except if configured) if not episode.is_finished(): if not config.auto_remove_unfinished_episodes: continue # Do not delete unplayed episodes (except if configured) if episode.is_new: if not config.auto_remove_unplayed_episodes: continue yield episode gpodder-3.5.2/src/gpodder/config.py0000644000175000017500000002760112220076757016625 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # config.py -- gPodder Configuration Manager # Thomas Perl 2007-11-02 # import gpodder from gpodder import util from gpodder import jsonconfig import atexit import os import shutil import time import logging _ = gpodder.gettext defaults = { # External applications used for playback 'player': { 'audio': 'default', 'video': 'default', }, # gpodder.net settings 'mygpo': { 'enabled': False, 'server': 'gpodder.net', 'username': '', 'password': '', 'device': { 'uid': util.get_hostname(), 'type': 'desktop', 'caption': _('gPodder on %s') % util.get_hostname(), }, }, # Various limits (downloading, updating, etc..) 'limit': { 'bandwidth': { 'enabled': False, 'kbps': 500.0, # maximum kB/s per download }, 'downloads': { 'enabled': True, 'concurrent': 1, }, 'episodes': 200, # max episodes per feed }, # Automatic feed updates, download removal and retry on download timeout 'auto': { 'update': { 'enabled': False, 'frequency': 20, # minutes }, 'cleanup': { 'days': 7, 'played': False, 'unplayed': False, 'unfinished': True, }, 'retries': 3, # number of retries when downloads time out }, # Software updates from gpodder.org (primary audience: Windows users) 'software_update': { 'check_on_startup': gpodder.ui.win32, # check for updates on start 'last_check': 0, # unix timestamp of last update check 'interval': 5, # interval (in days) to check for updates }, 'ui': { # Settings for the Command-Line Interface 'cli': { 'colors': True, }, # Settings for the QML UI (MeeGo Harmattan / N9) 'qml': { 'state': { 'episode_list_filter': 0, }, 'autorotate': False, }, # Settings for the Gtk UI 'gtk': { 'state': { 'main_window': { 'width': 700, 'height': 500, 'x': -1, 'y': -1, 'maximized': False, 'paned_position': 200, 'episode_list_size': 200, }, 'episode_selector': { 'width': 600, 'height': 400, 'x': -1, 'y': -1, 'maximized': False, }, 'episode_window': { 'width': 500, 'height': 400, 'x': -1, 'y': -1, 'maximized': False, }, }, 'toolbar': False, 'html_shownotes': True, 'new_episodes': 'show', # ignore, show, queue, download 'live_search_delay': 200, 'podcast_list': { 'all_episodes': True, 'sections': True, 'view_mode': 1, 'hide_empty': False, }, 'episode_list': { 'descriptions': True, 'view_mode': 1, 'columns': int('101', 2), # bitfield of visible columns }, 'download_list': { 'remove_finished': True, }, }, }, # Synchronization with portable devices (MP3 players, etc..) 'device_sync': { 'device_type': 'none', # Possible values: 'none', 'filesystem' 'device_folder': '/media', 'one_folder_per_podcast': True, 'skip_played_episodes': True, 'delete_played_episodes': False, 'max_filename_length': 999, 'custom_sync_name': '{episode.sortdate}_{episode.title}', 'custom_sync_name_enabled': False, 'after_sync': { 'mark_episodes_played': False, 'delete_episodes': False, 'sync_disks': False, }, 'playlists': { 'create': True, 'two_way_sync': False, 'use_absolute_path': True, 'folder': 'Playlists', } }, 'youtube': { 'preferred_fmt_id': 18, # default fmt_id (see fallbacks in youtube.py) 'preferred_fmt_ids': [], # for advanced uses (custom fallback sequence) }, 'extensions': { 'enabled': [], }, 'flattr': { 'token': '', 'flattr_on_play': False, }, } # The sooner this goes away, the better gPodderSettings_LegacySupport = { 'player': 'player.audio', 'videoplayer': 'player.video', 'limit_rate': 'limit.bandwidth.enabled', 'limit_rate_value': 'limit.bandwidth.kbps', 'max_downloads_enabled': 'limit.downloads.enabled', 'max_downloads': 'limit.downloads.concurrent', 'episode_old_age': 'auto.cleanup.days', 'auto_remove_played_episodes': 'auto.cleanup.played', 'auto_remove_unfinished_episodes': 'auto.cleanup.unfinished', 'auto_remove_unplayed_episodes': 'auto.cleanup.unplayed', 'max_episodes_per_feed': 'limit.episodes', 'show_toolbar': 'ui.gtk.toolbar', 'episode_list_descriptions': 'ui.gtk.episode_list.descriptions', 'podcast_list_view_all': 'ui.gtk.podcast_list.all_episodes', 'podcast_list_sections': 'ui.gtk.podcast_list.sections', 'enable_html_shownotes': 'ui.gtk.html_shownotes', 'episode_list_view_mode': 'ui.gtk.episode_list.view_mode', 'podcast_list_view_mode': 'ui.gtk.podcast_list.view_mode', 'podcast_list_hide_boring': 'ui.gtk.podcast_list.hide_empty', 'episode_list_columns': 'ui.gtk.episode_list.columns', 'auto_cleanup_downloads': 'ui.gtk.download_list.remove_finished', 'auto_update_feeds': 'auto.update.enabled', 'auto_update_frequency': 'auto.update.frequency', 'auto_download': 'ui.gtk.new_episodes', } logger = logging.getLogger(__name__) def config_value_to_string(config_value): config_type = type(config_value) if config_type == list: return ','.join(map(config_value_to_string, config_value)) elif config_type in (str, unicode): return config_value else: return str(config_value) def string_to_config_value(new_value, old_value): config_type = type(old_value) if config_type == list: return filter(None, [x.strip() for x in new_value.split(',')]) elif config_type == bool: return (new_value.strip().lower() in ('1', 'true')) else: return config_type(new_value) class Config(object): # Number of seconds after which settings are auto-saved WRITE_TO_DISK_TIMEOUT = 60 def __init__(self, filename='gpodder.json'): self.__json_config = jsonconfig.JsonConfig(default=defaults, on_key_changed=self._on_key_changed) self.__save_thread = None self.__filename = filename self.__observers = [] self.load() # If there is no configuration file, we create one here (bug 1511) if not os.path.exists(self.__filename): self.save() atexit.register(self.__atexit) def register_defaults(self, defaults): """ Register default configuration options (e.g. for extensions) This function takes a dictionary that will be merged into the current configuration if the keys don't yet exist. This can be used to add a default configuration for extension modules. """ self.__json_config._merge_keys(defaults) def add_observer(self, callback): """ Add a callback function as observer. This callback will be called when a setting changes. It should have this signature: observer(name, old_value, new_value) The "name" is the setting name, the "old_value" is the value that has been overwritten with "new_value". """ if callback not in self.__observers: self.__observers.append(callback) else: logger.warn('Observer already added: %s', repr(callback)) def remove_observer(self, callback): """ Remove an observer previously added to this object. """ if callback in self.__observers: self.__observers.remove(callback) else: logger.warn('Observer not added: %s', repr(callback)) def all_keys(self): return self.__json_config._keys_iter() def schedule_save(self): if self.__save_thread is None: self.__save_thread = util.run_in_background(self.save_thread_proc, True) def save_thread_proc(self): time.sleep(self.WRITE_TO_DISK_TIMEOUT) if self.__save_thread is not None: self.save() def __atexit(self): if self.__save_thread is not None: self.save() def save(self, filename=None): if filename is None: filename = self.__filename logger.info('Flushing settings to disk') try: fp = open(filename+'.tmp', 'wt') fp.write(repr(self.__json_config)) fp.close() util.atomic_rename(filename+'.tmp', filename) except: logger.error('Cannot write settings to %s', filename) util.delete_file(filename+'.tmp') raise self.__save_thread = None def load(self, filename=None): if filename is not None: self.__filename = filename if os.path.exists(self.__filename): try: data = open(self.__filename, 'rt').read() new_keys_added = self.__json_config._restore(data) except: logger.warn('Cannot parse config file: %s', self.__filename, exc_info=True) new_keys_added = False if new_keys_added: logger.info('New default keys added - saving config.') self.save() def toggle_flag(self, name): setattr(self, name, not getattr(self, name)) def update_field(self, name, new_value): """Update a config field, converting strings to the right types""" old_value = self._lookup(name) new_value = string_to_config_value(new_value, old_value) setattr(self, name, new_value) return True def _on_key_changed(self, name, old_value, value): if 'ui.gtk.state' not in name: # Only log non-UI state changes logger.debug('%s: %s -> %s', name, old_value, value) for observer in self.__observers: try: observer(name, old_value, value) except Exception, exception: logger.error('Error while calling observer %r: %s', observer, exception, exc_info=True) self.schedule_save() def __getattr__(self, name): if name in gPodderSettings_LegacySupport: name = gPodderSettings_LegacySupport[name] return getattr(self.__json_config, name) def __setattr__(self, name, value): if name.startswith('_'): object.__setattr__(self, name, value) return if name in gPodderSettings_LegacySupport: name = gPodderSettings_LegacySupport[name] setattr(self.__json_config, name, value) gpodder-3.5.2/src/gpodder/core.py0000644000175000017500000000417312220076757016307 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.core - Common functionality used by all UIs # Thomas Perl ; 2011-02-06 import gpodder from gpodder import util from gpodder import config from gpodder import dbsqlite from gpodder import extensions from gpodder import model from gpodder import flattr class Core(object): def __init__(self, config_class=config.Config, database_class=dbsqlite.Database, model_class=model.Model): # Initialize the gPodder home directory util.make_directory(gpodder.home) # Open the database and configuration file self.db = database_class(gpodder.database_file) self.model = model_class(self.db) self.config = config_class(gpodder.config_file) # Load extension modules and install the extension manager gpodder.user_extensions = extensions.ExtensionManager(self) # Load installed/configured plugins gpodder.load_plugins() # Update the current device in the configuration self.config.mygpo.device.type = util.detect_device_type() # Initialize Flattr integration self.flattr = flattr.Flattr(self.config.flattr) def shutdown(self): # Notify all extensions that we are being shut down gpodder.user_extensions.shutdown() # Close the database and store outstanding changes self.db.close() gpodder-3.5.2/src/gpodder/coverart.py0000644000175000017500000001013612220076757017200 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.coverart - Unified cover art downloading module (2012-03-04) # import gpodder _ = gpodder.gettext import logging logger = logging.getLogger(__name__) from gpodder import util from gpodder import youtube import os class CoverDownloader(object): # File name extension dict, lists supported cover art extensions # Values: functions that check if some data is of that file type SUPPORTED_EXTENSIONS = { '.png': lambda d: d.startswith('\x89PNG\r\n\x1a\n\x00'), '.jpg': lambda d: d.startswith('\xff\xd8'), '.gif': lambda d: d.startswith('GIF89a') or d.startswith('GIF87a'), } EXTENSIONS = SUPPORTED_EXTENSIONS.keys() ALL_EPISODES_ID = ':gpodder:all-episodes:' # Low timeout to avoid unnecessary hangs of GUIs TIMEOUT = 5 def __init__(self): pass def get_cover_all_episodes(self): return self._default_filename('podcast-all.png') def get_cover(self, filename, cover_url, feed_url, title, username=None, password=None, download=False): # Detection of "all episodes" podcast if filename == self.ALL_EPISODES_ID: return self.get_cover_all_episodes() # Return already existing files for extension in self.EXTENSIONS: if os.path.exists(filename + extension): return filename + extension # If allowed to download files, do so here if download: # YouTube-specific cover art image resolver youtube_cover_url = youtube.get_real_cover(feed_url) if youtube_cover_url is not None: cover_url = youtube_cover_url if not cover_url: return self._fallback_filename(title) # We have to add username/password, because password-protected # feeds might keep their cover art also protected (bug 1521) if username is not None and password is not None: cover_url = util.url_add_authentication(cover_url, username, password) try: logger.info('Downloading cover art: %s', cover_url) data = util.urlopen(cover_url, timeout=self.TIMEOUT).read() except Exception, e: logger.warn('Cover art download failed: %s', e) return self._fallback_filename(title) try: extension = None for filetype, check in self.SUPPORTED_EXTENSIONS.items(): if check(data): extension = filetype break if extension is None: msg = 'Unknown file type: %s (%r)' % (cover_url, data[:6]) raise ValueError(msg) # Successfully downloaded the cover art - save it! fp = open(filename + extension, 'wb') fp.write(data) fp.close() return filename + extension except Exception, e: logger.warn('Cannot save cover art', exc_info=True) # Fallback to cover art based on the podcast title return self._fallback_filename(title) def _default_filename(self, basename): return os.path.join(gpodder.images_folder, basename) def _fallback_filename(self, title): return self._default_filename('podcast-%d.png' % (hash(title)%5)) gpodder-3.5.2/src/gpodder/dbsqlite.py0000644000175000017500000002171312220076757017165 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # dbsqlite.py -- SQLite persistence layer for gPodder # # 2008-06-13 Justin Forest # 2010-04-24 Thomas Perl # from __future__ import with_statement import gpodder _ = gpodder.gettext import sys from sqlite3 import dbapi2 as sqlite import logging logger = logging.getLogger(__name__) from gpodder import schema from gpodder import util import threading import re class Database(object): TABLE_PODCAST = 'podcast' TABLE_EPISODE = 'episode' def __init__(self, filename): self.database_file = filename self._db = None self.lock = threading.RLock() def close(self): self.commit() with self.lock: cur = self.cursor() cur.execute("VACUUM") cur.close() self._db.close() self._db = None def purge(self, max_episodes, podcast_id): """ Deletes old episodes. Should be called before adding new episodes to a podcast. """ if max_episodes == 0: return with self.lock: cur = self.cursor() logger.debug('Purge requested for podcast %d', podcast_id) sql = """ DELETE FROM %s WHERE podcast_id = ? AND state <> ? AND id NOT IN (SELECT id FROM %s WHERE podcast_id = ? ORDER BY published DESC LIMIT ?)""" % (self.TABLE_EPISODE, self.TABLE_EPISODE) cur.execute(sql, (podcast_id, gpodder.STATE_DOWNLOADED, podcast_id, max_episodes)) cur.close() @property def db(self): if self._db is None: self._db = sqlite.connect(self.database_file, check_same_thread=False) # Check schema version, upgrade if necessary schema.upgrade(self._db, self.database_file) # Sanity checks for the data in the database schema.check_data(self) logger.debug('Database opened.') return self._db def cursor(self): return self.db.cursor() def commit(self): with self.lock: try: logger.debug('Commit.') self.db.commit() except Exception, e: logger.error('Cannot commit: %s', e, exc_info=True) def get_content_types(self, id): """Given a podcast ID, returns the content types""" with self.lock: cur = self.cursor() cur.execute('SELECT mime_type FROM %s WHERE podcast_id = ?' % self.TABLE_EPISODE, (id,)) for (mime_type,) in cur: yield mime_type cur.close() def get_podcast_statistics(self, podcast_id=None): """Given a podcast ID, returns the statistics for it If the podcast_id is omitted (using the default value), the statistics will be calculated over all podcasts. Returns a tuple (total, deleted, new, downloaded, unplayed) """ total, deleted, new, downloaded, unplayed = 0, 0, 0, 0, 0 with self.lock: cur = self.cursor() if podcast_id is not None: cur.execute('SELECT COUNT(*), state, is_new FROM %s WHERE podcast_id = ? GROUP BY state, is_new' % self.TABLE_EPISODE, (podcast_id,)) else: cur.execute('SELECT COUNT(*), state, is_new FROM %s GROUP BY state, is_new' % self.TABLE_EPISODE) for count, state, is_new in cur: total += count if state == gpodder.STATE_DELETED: deleted += count elif state == gpodder.STATE_NORMAL and is_new: new += count elif state == gpodder.STATE_DOWNLOADED: downloaded += count if is_new: unplayed += count cur.close() return (total, deleted, new, downloaded, unplayed) def load_podcasts(self, factory): logger.info('Loading podcasts') sql = 'SELECT * FROM %s' % self.TABLE_PODCAST with self.lock: cur = self.cursor() cur.execute(sql) keys = [desc[0] for desc in cur.description] result = map(lambda row: factory(dict(zip(keys, row)), self), cur) cur.close() return result def load_episodes(self, podcast, factory): assert podcast.id logger.info('Loading episodes for podcast %d', podcast.id) sql = 'SELECT * FROM %s WHERE podcast_id = ? ORDER BY published DESC' % self.TABLE_EPISODE args = (podcast.id,) with self.lock: cur = self.cursor() cur.execute(sql, args) keys = [desc[0] for desc in cur.description] result = map(lambda row: factory(dict(zip(keys, row))), cur) cur.close() return result def delete_podcast(self, podcast): assert podcast.id with self.lock: cur = self.cursor() logger.debug('delete_podcast: %d (%s)', podcast.id, podcast.url) cur.execute("DELETE FROM %s WHERE id = ?" % self.TABLE_PODCAST, (podcast.id, )) cur.execute("DELETE FROM %s WHERE podcast_id = ?" % self.TABLE_EPISODE, (podcast.id, )) cur.close() self.db.commit() def save_podcast(self, podcast): self._save_object(podcast, self.TABLE_PODCAST, schema.PodcastColumns) def save_episode(self, episode): self._save_object(episode, self.TABLE_EPISODE, schema.EpisodeColumns) def _save_object(self, o, table, columns): with self.lock: try: cur = self.cursor() values = [util.convert_bytes(getattr(o, name)) for name in columns] if o.id is None: qmarks = ', '.join('?'*len(columns)) sql = 'INSERT INTO %s (%s) VALUES (%s)' % (table, ', '.join(columns), qmarks) cur.execute(sql, values) o.id = cur.lastrowid else: qmarks = ', '.join('%s = ?' % name for name in columns) values.append(o.id) sql = 'UPDATE %s SET %s WHERE id = ?' % (table, qmarks) cur.execute(sql, values) except Exception, e: logger.error('Cannot save %s: %s', o, e, exc_info=True) cur.close() def get(self, sql, params=None): """ Returns the first cell of a query result, useful for COUNT()s. """ with self.lock: cur = self.cursor() if params is None: cur.execute(sql) else: cur.execute(sql, params) row = cur.fetchone() cur.close() if row is None: return None else: return row[0] def podcast_download_folder_exists(self, foldername): """ Returns True if a foldername for a channel exists. False otherwise. """ foldername = util.convert_bytes(foldername) return self.get("SELECT id FROM %s WHERE download_folder = ?" % self.TABLE_PODCAST, (foldername,)) is not None def episode_filename_exists(self, podcast_id, filename): """ Returns True if a filename for an episode exists. False otherwise. """ filename = util.convert_bytes(filename) return self.get("SELECT id FROM %s WHERE podcast_id = ? AND download_filename = ?" % self.TABLE_EPISODE, (podcast_id, filename,)) is not None def get_last_published(self, podcast): """ Look up the most recent publish date of a podcast. """ return self.get('SELECT MAX(published) FROM %s WHERE podcast_id = ?' % self.TABLE_EPISODE, (podcast.id,)) def delete_episode_by_guid(self, guid, podcast_id): """ Deletes episodes that have a specific GUID for a given channel. Used after feed updates for episodes that have disappeared from the feed. """ guid = util.convert_bytes(guid) with self.lock: cur = self.cursor() cur.execute('DELETE FROM %s WHERE podcast_id = ? AND guid = ?' % self.TABLE_EPISODE, (podcast_id, guid)) gpodder-3.5.2/src/gpodder/dbusproxy.py0000644000175000017500000001251112220076757017411 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.dbusproxy - Expose Podcasts over D-Bus # Based on a patch by Iwan van der Kleijn # See also: http://gpodder.org/bug/699 import gpodder from gpodder import util import dbus import dbus.service def safe_str(txt): if txt: return txt.encode() else: return '' def safe_first_line(txt): txt = safe_str(txt) lines = util.remove_html_tags(txt).strip().splitlines() if not lines or lines[0] == '': return '' else: return lines[0] class DBusPodcastsProxy(dbus.service.Object): """ Implements API accessible through D-Bus Methods on DBusPodcastsProxy can be called by D-Bus clients. They implement safe-guards to work safely over D-Bus while having type signatures applied for parameter and return values. """ #DBusPodcastsProxy(lambda: self.channels, self.on_itemUpdate_activate(), self.playback_episodes, self.download_episode_list, bus_name) def __init__(self, get_podcast_list, \ check_for_updates, playback_episodes, \ download_episodes, episode_from_uri, \ bus_name): self._get_podcasts = get_podcast_list self._on_check_for_updates = check_for_updates self._playback_episodes = playback_episodes self._download_episodes = download_episodes self._episode_from_uri = episode_from_uri dbus.service.Object.__init__(self, \ object_path=gpodder.dbus_podcasts_object_path, \ bus_name=bus_name) def _get_episode_refs(self, urls): """Get Episode instances associated with URLs""" episodes = [] for p in self._get_podcasts(): for e in p.get_all_episodes(): if e.url in urls: episodes.append(e) return episodes @dbus.service.method(dbus_interface=gpodder.dbus_podcasts, in_signature='', out_signature='a(ssss)') def get_podcasts(self): """Get all podcasts in gPodder's subscription list""" def podcast_to_tuple(podcast): title = safe_str(podcast.title) url = safe_str(podcast.url) description = safe_first_line(podcast.description) cover_file = '' return (title, url, description, cover_file) return [podcast_to_tuple(p) for p in self._get_podcasts()] @dbus.service.method(dbus_interface=gpodder.dbus_podcasts, in_signature='s', out_signature='ss') def get_episode_title(self, url): episode = self._episode_from_uri(url) if episode is not None: return episode.title, episode.channel.title return ('', '') @dbus.service.method(dbus_interface=gpodder.dbus_podcasts, in_signature='s', out_signature='a(sssssbbb)') def get_episodes(self, url): """Return all episodes of the podcast with the given URL""" podcast = None for channel in self._get_podcasts(): if channel.url == url: podcast = channel break if podcast is None: return [] def episode_to_tuple(episode): title = safe_str(episode.title) url = safe_str(episode.url) description = safe_first_line(episode.description) filename = safe_str(episode.download_filename) file_type = safe_str(episode.file_type()) is_new = (episode.state == gpodder.STATE_NORMAL and episode.is_new) is_downloaded = episode.was_downloaded(and_exists=True) is_deleted = (episode.state == gpodder.STATE_DELETED) return (title, url, description, filename, file_type, is_new, is_downloaded, is_deleted) return [episode_to_tuple(e) for e in podcast.get_all_episodes()] @dbus.service.method(dbus_interface=gpodder.dbus_podcasts, in_signature='as', out_signature='(bs)') def play_or_download_episode(self, urls): """Play (or download) a list of episodes given by URL""" episodes = self._get_episode_refs(urls) if not episodes: return (0, 'No episodes found') to_playback = [e for e in episodes if e.was_downloaded(and_exists=True)] to_download = [e for e in episodes if e not in to_playback] if to_playback: self._playback_episodes(to_playback) if to_download: self._download_episodes(to_download) return (1, 'Success') @dbus.service.method(dbus_interface=gpodder.dbus_podcasts, in_signature='', out_signature='') def check_for_updates(self): """Check for new episodes or offer subscriptions""" self._on_check_for_updates() gpodder-3.5.2/src/gpodder/download.py0000644000175000017500000010332712220076757017167 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # download.py -- Download queue management # Thomas Perl 2007-09-15 # # Based on libwget.py (2005-10-29) # from __future__ import with_statement import logging logger = logging.getLogger(__name__) from gpodder import util from gpodder import youtube from gpodder import vimeo import gpodder import socket import threading import urllib import urlparse import shutil import os.path import os import time import collections import mimetypes import email from email.header import decode_header _ = gpodder.gettext def get_header_param(headers, param, header_name): """Extract a HTTP header parameter from a dict Uses the "email" module to retrieve parameters from HTTP headers. This can be used to get the "filename" parameter of the "content-disposition" header for downloads to pick a good filename. Returns None if the filename cannot be retrieved. """ value = None try: headers_string = ['%s:%s'%(k,v) for k,v in headers.items()] msg = email.message_from_string('\n'.join(headers_string)) if header_name in msg: raw_value = msg.get_param(param, header=header_name) if raw_value is not None: value = email.utils.collapse_rfc2231_value(raw_value) except Exception, e: logger.error('Cannot get %s from %s', param, header_name, exc_info=True) return value class ContentRange(object): # Based on: # http://svn.pythonpaste.org/Paste/WebOb/trunk/webob/byterange.py # # Copyright (c) 2007 Ian Bicking and Contributors # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ Represents the Content-Range header This header is ``start-stop/length``, where stop and length can be ``*`` (represented as None in the attributes). """ def __init__(self, start, stop, length): assert start >= 0, "Bad start: %r" % start assert stop is None or (stop >= 0 and stop >= start), ( "Bad stop: %r" % stop) self.start = start self.stop = stop self.length = length def __repr__(self): return '<%s %s>' % ( self.__class__.__name__, self) def __str__(self): if self.stop is None: stop = '*' else: stop = self.stop + 1 if self.length is None: length = '*' else: length = self.length return 'bytes %s-%s/%s' % (self.start, stop, length) def __iter__(self): """ Mostly so you can unpack this, like: start, stop, length = res.content_range """ return iter([self.start, self.stop, self.length]) @classmethod def parse(cls, value): """ Parse the header. May return None if it cannot parse. """ if value is None: return None value = value.strip() if not value.startswith('bytes '): # Unparseable return None value = value[len('bytes '):].strip() if '/' not in value: # Invalid, no length given return None range, length = value.split('/', 1) if '-' not in range: # Invalid, no range return None start, end = range.split('-', 1) try: start = int(start) if end == '*': end = None else: end = int(end) if length == '*': length = None else: length = int(length) except ValueError: # Parse problem return None if end is None: return cls(start, None, length) else: return cls(start, end-1, length) class DownloadCancelledException(Exception): pass class AuthenticationError(Exception): pass class gPodderDownloadHTTPError(Exception): def __init__(self, url, error_code, error_message): self.url = url self.error_code = error_code self.error_message = error_message class DownloadURLOpener(urllib.FancyURLopener): version = gpodder.user_agent # Sometimes URLs are not escaped correctly - try to fix them # (see RFC2396; Section 2.4.3. Excluded US-ASCII Characters) # FYI: The omission of "%" in the list is to avoid double escaping! ESCAPE_CHARS = dict((ord(c), u'%%%x'%ord(c)) for c in u' <>#"{}|\\^[]`') def __init__( self, channel): self.channel = channel self._auth_retry_counter = 0 urllib.FancyURLopener.__init__(self, None) def http_error_default(self, url, fp, errcode, errmsg, headers): """ FancyURLopener by default does not raise an exception when there is some unknown HTTP error code. We want to override this and provide a function to log the error and raise an exception, so we don't download the HTTP error page here. """ # The following two lines are copied from urllib.URLopener's # implementation of http_error_default void = fp.read() fp.close() raise gPodderDownloadHTTPError(url, errcode, errmsg) def redirect_internal(self, url, fp, errcode, errmsg, headers, data): """ This is the exact same function that's included with urllib except with "void = fp.read()" commented out. """ if 'location' in headers: newurl = headers['location'] elif 'uri' in headers: newurl = headers['uri'] else: return # This blocks forever(?) with certain servers (see bug #465) #void = fp.read() fp.close() # In case the server sent a relative URL, join with original: newurl = urlparse.urljoin(self.type + ":" + url, newurl) return self.open(newurl) # The following is based on Python's urllib.py "URLopener.retrieve" # Also based on http://mail.python.org/pipermail/python-list/2001-October/110069.html def http_error_206(self, url, fp, errcode, errmsg, headers, data=None): # The next line is taken from urllib's URLopener.open_http # method, at the end after the line "if errcode == 200:" return urllib.addinfourl(fp, headers, 'http:' + url) def retrieve_resume(self, url, filename, reporthook=None, data=None): """Download files from an URL; return (headers, real_url) Resumes a download if the local filename exists and the server supports download resuming. """ current_size = 0 tfp = None if os.path.exists(filename): try: current_size = os.path.getsize(filename) tfp = open(filename, 'ab') #If the file exists, then only download the remainder if current_size > 0: self.addheader('Range', 'bytes=%s-' % (current_size)) except: logger.warn('Cannot resume download: %s', filename, exc_info=True) tfp = None current_size = 0 if tfp is None: tfp = open(filename, 'wb') # Fix a problem with bad URLs that are not encoded correctly (bug 549) url = url.decode('ascii', 'ignore') url = url.translate(self.ESCAPE_CHARS) url = url.encode('ascii') url = urllib.unwrap(urllib.toBytes(url)) fp = self.open(url, data) headers = fp.info() if current_size > 0: # We told the server to resume - see if she agrees # See RFC2616 (206 Partial Content + Section 14.16) # XXX check status code here, too... range = ContentRange.parse(headers.get('content-range', '')) if range is None or range.start != current_size: # Ok, that did not work. Reset the download # TODO: seek and truncate if content-range differs from request tfp.close() tfp = open(filename, 'wb') current_size = 0 logger.warn('Cannot resume: Invalid Content-Range (RFC2616).') result = headers, fp.geturl() bs = 1024*8 size = -1 read = current_size blocknum = int(current_size/bs) if reporthook: if "content-length" in headers: size = int(headers.getrawheader("Content-Length")) + current_size reporthook(blocknum, bs, size) while read < size or size == -1: if size == -1: block = fp.read(bs) else: block = fp.read(min(size-read, bs)) if block == "": break read += len(block) tfp.write(block) blocknum += 1 if reporthook: reporthook(blocknum, bs, size) fp.close() tfp.close() del fp del tfp # raise exception if actual size does not match content-length header if size >= 0 and read < size: raise urllib.ContentTooShortError("retrieval incomplete: got only %i out " "of %i bytes" % (read, size), result) return result # end code based on urllib.py def prompt_user_passwd( self, host, realm): # Keep track of authentication attempts, fail after the third one self._auth_retry_counter += 1 if self._auth_retry_counter > 3: raise AuthenticationError(_('Wrong username/password')) if self.channel.auth_username or self.channel.auth_password: logger.debug('Authenticating as "%s" to "%s" for realm "%s".', self.channel.auth_username, host, realm) return ( self.channel.auth_username, self.channel.auth_password ) return (None, None) class DownloadQueueWorker(object): def __init__(self, queue, exit_callback, continue_check_callback, minimum_tasks): self.queue = queue self.exit_callback = exit_callback self.continue_check_callback = continue_check_callback # The minimum amount of tasks that should be downloaded by this worker # before using the continue_check_callback to determine if it might # continue accepting tasks. This can be used to forcefully start a # download, even if a download limit is in effect. self.minimum_tasks = minimum_tasks def __repr__(self): return threading.current_thread().getName() def run(self): logger.info('Starting new thread: %s', self) while True: # Check if this thread is allowed to continue accepting tasks # (But only after reducing minimum_tasks to zero - see above) if self.minimum_tasks > 0: self.minimum_tasks -= 1 elif not self.continue_check_callback(self): return try: task = self.queue.pop() logger.info('%s is processing: %s', self, task) task.run() task.recycle() except IndexError, e: logger.info('No more tasks for %s to carry out.', self) break self.exit_callback(self) class DownloadQueueManager(object): def __init__(self, config): self._config = config self.tasks = collections.deque() self.worker_threads_access = threading.RLock() self.worker_threads = [] def __exit_callback(self, worker_thread): with self.worker_threads_access: self.worker_threads.remove(worker_thread) def __continue_check_callback(self, worker_thread): with self.worker_threads_access: if len(self.worker_threads) > self._config.max_downloads and \ self._config.max_downloads_enabled: self.worker_threads.remove(worker_thread) return False else: return True def spawn_threads(self, force_start=False): """Spawn new worker threads if necessary If force_start is True, forcefully spawn a thread and let it process at least one episodes, even if a download limit is in effect at the moment. """ with self.worker_threads_access: if not len(self.tasks): return if force_start or len(self.worker_threads) == 0 or \ len(self.worker_threads) < self._config.max_downloads or \ not self._config.max_downloads_enabled: # We have to create a new thread here, there's work to do logger.info('Starting new worker thread.') # The new worker should process at least one task (the one # that we want to forcefully start) if force_start is True. if force_start: minimum_tasks = 1 else: minimum_tasks = 0 worker = DownloadQueueWorker(self.tasks, self.__exit_callback, self.__continue_check_callback, minimum_tasks) self.worker_threads.append(worker) util.run_in_background(worker.run) def are_queued_or_active_tasks(self): with self.worker_threads_access: return len(self.worker_threads) > 0 def add_task(self, task, force_start=False): """Add a new task to the download queue If force_start is True, ignore the download limit and forcefully start the download right away. """ if task.status != DownloadTask.INIT: # Remove the task from its current position in the # download queue (if any) to avoid race conditions # where two worker threads download the same file try: self.tasks.remove(task) except ValueError, e: pass task.status = DownloadTask.QUEUED if force_start: # Add the task to be taken on next pop self.tasks.append(task) else: # Add the task to the end of the queue self.tasks.appendleft(task) self.spawn_threads(force_start) class DownloadTask(object): """An object representing the download task of an episode You can create a new download task like this: task = DownloadTask(episode, gpodder.config.Config(CONFIGFILE)) task.status = DownloadTask.QUEUED task.run() While the download is in progress, you can access its properties: task.total_size # in bytes task.progress # from 0.0 to 1.0 task.speed # in bytes per second str(task) # name of the episode task.status # current status task.status_changed # True if the status has been changed (see below) task.url # URL of the episode being downloaded task.podcast_url # URL of the podcast this download belongs to task.episode # Episode object of this task You can cancel a running download task by setting its status: task.status = DownloadTask.CANCELLED The task will then abort as soon as possible (due to the nature of downloading data, this can take a while when the Internet is busy). The "status_changed" attribute gets set to True everytime the "status" attribute changes its value. After you get the value of the "status_changed" attribute, it is always reset to False: if task.status_changed: new_status = task.status # .. update the UI accordingly .. Obviously, this also means that you must have at most *one* place in your UI code where you check for status changes and broadcast the status updates from there. While the download is taking place and after the .run() method has finished, you can get the final status to check if the download was successful: if task.status == DownloadTask.DONE: # .. everything ok .. elif task.status == DownloadTask.FAILED: # .. an error happened, and the # error_message attribute is set .. print task.error_message elif task.status == DownloadTask.PAUSED: # .. user paused the download .. elif task.status == DownloadTask.CANCELLED: # .. user cancelled the download .. The difference between cancelling and pausing a DownloadTask is that the temporary file gets deleted when cancelling, but does not get deleted when pausing. Be sure to call .removed_from_list() on this task when removing it from the UI, so that it can carry out any pending clean-up actions (e.g. removing the temporary file when the task has not finished successfully; i.e. task.status != DownloadTask.DONE). The UI can call the method "notify_as_finished()" to determine if this episode still has still to be shown as "finished" download in a notification window. This will return True only the first time it is called when the status is DONE. After returning True once, it will always return False afterwards. The same thing works for failed downloads ("notify_as_failed()"). """ # Possible states this download task can be in STATUS_MESSAGE = (_('Added'), _('Queued'), _('Downloading'), _('Finished'), _('Failed'), _('Cancelled'), _('Paused')) (INIT, QUEUED, DOWNLOADING, DONE, FAILED, CANCELLED, PAUSED) = range(7) # Wheter this task represents a file download or a device sync operation ACTIVITY_DOWNLOAD, ACTIVITY_SYNCHRONIZE = range(2) # Minimum time between progress updates (in seconds) MIN_TIME_BETWEEN_UPDATES = 1. def __str__(self): return self.__episode.title def __get_status(self): return self.__status def __set_status(self, status): if status != self.__status: self.__status_changed = True self.__status = status status = property(fget=__get_status, fset=__set_status) def __get_status_changed(self): if self.__status_changed: self.__status_changed = False return True else: return False status_changed = property(fget=__get_status_changed) def __get_activity(self): return self.__activity def __set_activity(self, activity): self.__activity = activity activity = property(fget=__get_activity, fset=__set_activity) def __get_url(self): return self.__episode.url url = property(fget=__get_url) def __get_podcast_url(self): return self.__episode.channel.url podcast_url = property(fget=__get_podcast_url) def __get_episode(self): return self.__episode episode = property(fget=__get_episode) def cancel(self): if self.status in (self.DOWNLOADING, self.QUEUED): self.status = self.CANCELLED def removed_from_list(self): if self.status != self.DONE: util.delete_file(self.tempname) def __init__(self, episode, config): assert episode.download_task is None self.__status = DownloadTask.INIT self.__activity = DownloadTask.ACTIVITY_DOWNLOAD self.__status_changed = True self.__episode = episode self._config = config # Create the target filename and save it in the database self.filename = self.__episode.local_filename(create=True) self.tempname = self.filename + '.partial' self.total_size = self.__episode.file_size self.speed = 0.0 self.progress = 0.0 self.error_message = None # Have we already shown this task in a notification? self._notification_shown = False # Variables for speed limit and speed calculation self.__start_time = 0 self.__start_blocks = 0 self.__limit_rate_value = self._config.limit_rate_value self.__limit_rate = self._config.limit_rate # Progress update functions self._progress_updated = None self._last_progress_updated = 0. # If the tempname already exists, set progress accordingly if os.path.exists(self.tempname): try: already_downloaded = os.path.getsize(self.tempname) if self.total_size > 0: self.progress = max(0.0, min(1.0, float(already_downloaded)/self.total_size)) except OSError, os_error: logger.error('Cannot get size for %s', os_error) else: # "touch self.tempname", so we also get partial # files for resuming when the file is queued open(self.tempname, 'w').close() # Store a reference to this task in the episode episode.download_task = self def notify_as_finished(self): if self.status == DownloadTask.DONE: if self._notification_shown: return False else: self._notification_shown = True return True return False def notify_as_failed(self): if self.status == DownloadTask.FAILED: if self._notification_shown: return False else: self._notification_shown = True return True return False def add_progress_callback(self, callback): self._progress_updated = callback def status_updated(self, count, blockSize, totalSize): # We see a different "total size" while downloading, # so correct the total size variable in the thread if totalSize != self.total_size and totalSize > 0: self.total_size = float(totalSize) if self.__episode.file_size != self.total_size: logger.debug('Updating file size of %s to %s', self.filename, self.total_size) self.__episode.file_size = self.total_size self.__episode.save() if self.total_size > 0: self.progress = max(0.0, min(1.0, float(count*blockSize)/self.total_size)) if self._progress_updated is not None: diff = time.time() - self._last_progress_updated if diff > self.MIN_TIME_BETWEEN_UPDATES or self.progress == 1.: self._progress_updated(self.progress) self._last_progress_updated = time.time() self.calculate_speed(count, blockSize) if self.status == DownloadTask.CANCELLED: raise DownloadCancelledException() if self.status == DownloadTask.PAUSED: raise DownloadCancelledException() def calculate_speed(self, count, blockSize): if count % 5 == 0: now = time.time() if self.__start_time > 0: # Has rate limiting been enabled or disabled? if self.__limit_rate != self._config.limit_rate: # If it has been enabled then reset base time and block count if self._config.limit_rate: self.__start_time = now self.__start_blocks = count self.__limit_rate = self._config.limit_rate # Has the rate been changed and are we currently limiting? if self.__limit_rate_value != self._config.limit_rate_value and self.__limit_rate: self.__start_time = now self.__start_blocks = count self.__limit_rate_value = self._config.limit_rate_value passed = now - self.__start_time if passed > 0: speed = ((count-self.__start_blocks)*blockSize)/passed else: speed = 0 else: self.__start_time = now self.__start_blocks = count passed = now - self.__start_time speed = count*blockSize self.speed = float(speed) if self._config.limit_rate and speed > self._config.limit_rate_value: # calculate the time that should have passed to reach # the desired download rate and wait if necessary should_have_passed = float((count-self.__start_blocks)*blockSize)/(self._config.limit_rate_value*1024.0) if should_have_passed > passed: # sleep a maximum of 10 seconds to not cause time-outs delay = min(10.0, float(should_have_passed-passed)) time.sleep(delay) def recycle(self): self.episode.download_task = None def run(self): # Speed calculation (re-)starts here self.__start_time = 0 self.__start_blocks = 0 # If the download has already been cancelled, skip it if self.status == DownloadTask.CANCELLED: util.delete_file(self.tempname) self.progress = 0.0 self.speed = 0.0 return False # We only start this download if its status is "queued" if self.status != DownloadTask.QUEUED: return False # We are downloading this file right now self.status = DownloadTask.DOWNLOADING self._notification_shown = False try: # Resolve URL and start downloading the episode fmt_ids = youtube.get_fmt_ids(self._config.youtube) url = youtube.get_real_download_url(self.__episode.url, fmt_ids) url = vimeo.get_real_download_url(url) downloader = DownloadURLOpener(self.__episode.channel) # HTTP Status codes for which we retry the download retry_codes = (408, 418, 504, 598, 599) max_retries = max(0, self._config.auto.retries) # Retry the download on timeout (bug 1013) for retry in range(max_retries + 1): if retry > 0: logger.info('Retrying download of %s (%d)', url, retry) time.sleep(1) try: headers, real_url = downloader.retrieve_resume(url, self.tempname, reporthook=self.status_updated) # If we arrive here, the download was successful break except urllib.ContentTooShortError, ctse: if retry < max_retries: logger.info('Content too short: %s - will retry.', url) continue raise except socket.timeout, tmout: if retry < max_retries: logger.info('Socket timeout: %s - will retry.', url) continue raise except gPodderDownloadHTTPError, http: if retry < max_retries and http.error_code in retry_codes: logger.info('HTTP error %d: %s - will retry.', http.error_code, url) continue raise new_mimetype = headers.get('content-type', self.__episode.mime_type) old_mimetype = self.__episode.mime_type _basename, ext = os.path.splitext(self.filename) if new_mimetype != old_mimetype or util.wrong_extension(ext): logger.info('Updating mime type: %s => %s', old_mimetype, new_mimetype) old_extension = self.__episode.extension() self.__episode.mime_type = new_mimetype new_extension = self.__episode.extension() # If the desired filename extension changed due to the new # mimetype, we force an update of the local filename to fix the # extension. if old_extension != new_extension or util.wrong_extension(ext): self.filename = self.__episode.local_filename(create=True, force_update=True) # In some cases, the redirect of a URL causes the real filename to # be revealed in the final URL (e.g. http://gpodder.org/bug/1423) if real_url != url and not util.is_known_redirecter(real_url): realname, realext = util.filename_from_url(real_url) # Only update from redirect if the redirected-to filename has # a proper extension (this is needed for e.g. YouTube) if not util.wrong_extension(realext): real_filename = ''.join((realname, realext)) self.filename = self.__episode.local_filename(create=True, force_update=True, template=real_filename) logger.info('Download was redirected (%s). New filename: %s', real_url, os.path.basename(self.filename)) # Look at the Content-disposition header; use if if available disposition_filename = get_header_param(headers, \ 'filename', 'content-disposition') # Some servers do send the content-disposition header, but provide # an empty filename, resulting in an empty string here (bug 1440) if disposition_filename is not None and disposition_filename != '': # The server specifies a download filename - try to use it disposition_filename = os.path.basename(disposition_filename) self.filename = self.__episode.local_filename(create=True, \ force_update=True, template=disposition_filename) new_mimetype, encoding = mimetypes.guess_type(self.filename) if new_mimetype is not None: logger.info('Using content-disposition mimetype: %s', new_mimetype) self.__episode.mime_type = new_mimetype # Re-evaluate filename and tempname to take care of podcast renames # while downloads are running (which will change both file names) self.filename = self.__episode.local_filename(create=False) self.tempname = os.path.join(os.path.dirname(self.filename), os.path.basename(self.tempname)) shutil.move(self.tempname, self.filename) # Model- and database-related updates after a download has finished self.__episode.on_downloaded(self.filename) except DownloadCancelledException: logger.info('Download has been cancelled/paused: %s', self) if self.status == DownloadTask.CANCELLED: util.delete_file(self.tempname) self.progress = 0.0 self.speed = 0.0 except urllib.ContentTooShortError, ctse: self.status = DownloadTask.FAILED self.error_message = _('Missing content from server') except IOError, ioe: logger.error('%s while downloading "%s": %s', ioe.strerror, self.__episode.title, ioe.filename, exc_info=True) self.status = DownloadTask.FAILED d = {'error': ioe.strerror, 'filename': ioe.filename} self.error_message = _('I/O Error: %(error)s: %(filename)s') % d except gPodderDownloadHTTPError, gdhe: logger.error('HTTP %s while downloading "%s": %s', gdhe.error_code, self.__episode.title, gdhe.error_message, exc_info=True) self.status = DownloadTask.FAILED d = {'code': gdhe.error_code, 'message': gdhe.error_message} self.error_message = _('HTTP Error %(code)s: %(message)s') % d except Exception, e: self.status = DownloadTask.FAILED logger.error('Download failed: %s', str(e), exc_info=True) self.error_message = _('Error: %s') % (str(e),) if self.status == DownloadTask.DOWNLOADING: # Everything went well - we're done self.status = DownloadTask.DONE if self.total_size <= 0: self.total_size = util.calculate_size(self.filename) logger.info('Total size updated to %d', self.total_size) self.progress = 1.0 gpodder.user_extensions.on_episode_downloaded(self.__episode) return True self.speed = 0.0 # We finished, but not successfully (at least not really) return False gpodder-3.5.2/src/gpodder/extensions.py0000644000175000017500000004573312220076757017565 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2009 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """ Loads and executes user extensions Extensions are Python scripts in "$GPODDER_HOME/Extensions". Each script must define a class named "gPodderExtension", otherwise it will be ignored. The extensions class defines several callbacks that will be called by gPodder at certain points. See the methods defined below for a list of callbacks and their parameters. For an example extension see share/gpodder/examples/extensions.py """ import glob import imp import inspect import json import os import functools import shlex import subprocess import sys import re from datetime import datetime import gpodder _ = gpodder.gettext from gpodder import util import logging logger = logging.getLogger(__name__) CATEGORY_DICT = { 'desktop-integration': _('Desktop Integration'), 'interface': _('Interface'), 'post-download': _('Post download'), } DEFAULT_CATEGORY = _('Other') def call_extensions(func): """Decorator to create handler functions in ExtensionManager Calls the specified function in all user extensions that define it. """ method_name = func.__name__ @functools.wraps(func) def handler(self, *args, **kwargs): result = None for container in self.containers: if not container.enabled or container.module is None: continue try: callback = getattr(container.module, method_name, None) if callback is None: continue # If the results are lists, concatenate them to show all # possible items that are generated by all extension together cb_res = callback(*args, **kwargs) if isinstance(result, list) and isinstance(cb_res, list): result.extend(cb_res) elif cb_res is not None: result = cb_res except Exception, exception: logger.error('Error in %s in %s: %s', container.filename, method_name, exception, exc_info=True) func(self, *args, **kwargs) return result return handler class ExtensionMetadata(object): # Default fallback metadata in case metadata fields are missing DEFAULTS = { 'description': _('No description for this extension.'), 'doc': None, 'payment': None, } SORTKEYS = { 'title': 1, 'description': 2, 'category': 3, 'authors': 4, 'only_for': 5, 'mandatory_in': 6, 'disable_in': 7, } def __init__(self, container, metadata): if 'title' not in metadata: metadata['title'] = container.name category = metadata.get('category', 'other') metadata['category'] = CATEGORY_DICT.get(category, DEFAULT_CATEGORY) self.__dict__.update(metadata) def __getattr__(self, name): try: return self.DEFAULTS[name] except KeyError, e: raise AttributeError(name, e) def get_sorted(self): kf = lambda x: self.SORTKEYS.get(x[0], 99) return sorted([(k, v) for k, v in self.__dict__.items()], key=kf) def check_ui(self, target, default): """Checks metadata information like __only_for__ = 'gtk' __mandatory_in__ = 'gtk' __disable_in__ = 'gtk' The metadata fields in an extension can be a string with comma-separated values for UIs. This will be checked against boolean variables in the "gpodder.ui" object. Example metadata field in an extension: __only_for__ = 'gtk,qml' __only_for__ = 'unity' In this case, this function will return the value of the default if any of the following expressions will evaluate to True: gpodder.ui.gtk gpodder.ui.qml gpodder.ui.unity gpodder.ui.cli gpodder.ui.osx gpodder.ui.win32 New, unknown UIs are silently ignored and will evaluate to False. """ if not hasattr(self, target): return default uis = filter(None, [x.strip() for x in getattr(self, target).split(',')]) return any(getattr(gpodder.ui, ui.lower(), False) for ui in uis) @property def available_for_current_ui(self): return self.check_ui('only_for', True) @property def mandatory_in_current_ui(self): return self.check_ui('mandatory_in', False) @property def disable_in_current_ui(self): return self.check_ui('disable_in', False) class MissingDependency(Exception): def __init__(self, message, dependency, cause=None): Exception.__init__(self, message) self.dependency = dependency self.cause = cause class MissingModule(MissingDependency): pass class MissingCommand(MissingDependency): pass class ExtensionContainer(object): """An extension container wraps one extension module""" def __init__(self, manager, name, config, filename=None, module=None): self.manager = manager self.name = name self.config = config self.filename = filename self.module = module self.enabled = False self.error = None self.default_config = None self.parameters = None self.metadata = ExtensionMetadata(self, self._load_metadata(filename)) def require_command(self, command): """Checks if the given command is installed on the system Returns the complete path of the command @param command: String with the command name """ result = util.find_command(command) if result is None: msg = _('Command not found: %(command)s') % {'command': command} raise MissingCommand(msg, command) return result def require_any_command(self, command_list): """Checks if any of the given commands is installed on the system Returns the complete path of first found command in the list @param command: List with the commands name """ for command in command_list: result = util.find_command(command) if result is not None: return result msg = _('Need at least one of the following commands: %(list_of_commands)s') % \ {'list_of_commands': ', '.join(command_list)} raise MissingCommand(msg, ', '.join(command_list)) def _load_metadata(self, filename): if not filename or not os.path.exists(filename): return {} extension_py = open(filename).read() metadata = dict(re.findall("__([a-z_]+)__ = '([^']+)'", extension_py)) # Support for using gpodder.gettext() as _ to localize text localized_metadata = dict(re.findall("__([a-z_]+)__ = _\('([^']+)'\)", extension_py)) for key in localized_metadata: metadata[key] = gpodder.gettext(localized_metadata[key]) return metadata def set_enabled(self, enabled): if enabled and not self.enabled: try: self.load_extension() self.error = None self.enabled = True if hasattr(self.module, 'on_load'): self.module.on_load() except Exception, exception: logger.error('Cannot load %s from %s: %s', self.name, self.filename, exception, exc_info=True) if isinstance(exception, ImportError): # Wrap ImportError in MissingCommand for user-friendly # message (might be displayed in the GUI) match = re.match('No module named (.*)', exception.message) if match: module = match.group(1) msg = _('Python module not found: %(module)s') % { 'module': module } exception = MissingCommand(msg, module, exception) self.error = exception self.enabled = False elif not enabled and self.enabled: try: if hasattr(self.module, 'on_unload'): self.module.on_unload() except Exception, exception: logger.error('Failed to on_unload %s: %s', self.name, exception, exc_info=True) self.enabled = False def load_extension(self): """Load and initialize the gPodder extension module""" if self.module is not None: logger.info('Module already loaded.') return if not self.metadata.available_for_current_ui: logger.info('Not loading "%s" (only_for = "%s")', self.name, self.metadata.only_for) return basename, extension = os.path.splitext(os.path.basename(self.filename)) fp = open(self.filename, 'r') try: module_file = imp.load_module(basename, fp, self.filename, (extension, 'r', imp.PY_SOURCE)) finally: # Remove the .pyc file if it was created during import util.delete_file(self.filename + 'c') fp.close() self.default_config = getattr(module_file, 'DefaultConfig', {}) if self.default_config: self.manager.core.config.register_defaults({ 'extensions': { self.name: self.default_config, } }) self.config = getattr(self.manager.core.config.extensions, self.name) self.module = module_file.gPodderExtension(self) logger.info('Module loaded: %s', self.filename) class ExtensionManager(object): """Loads extensions and manages self-registering plugins""" def __init__(self, core): self.core = core self.filenames = os.environ.get('GPODDER_EXTENSIONS', '').split() self.containers = [] core.config.add_observer(self._config_value_changed) enabled_extensions = core.config.extensions.enabled if os.environ.get('GPODDER_DISABLE_EXTENSIONS', '') != '': logger.info('Disabling all extensions (from environment)') return for name, filename in self._find_extensions(): logger.debug('Found extension "%s" in %s', name, filename) config = getattr(core.config.extensions, name) container = ExtensionContainer(self, name, config, filename) if (name in enabled_extensions or container.metadata.mandatory_in_current_ui): container.set_enabled(True) if (name in enabled_extensions and container.metadata.disable_in_current_ui): container.set_enabled(False) self.containers.append(container) def shutdown(self): for container in self.containers: container.set_enabled(False) def _config_value_changed(self, name, old_value, new_value): if name != 'extensions.enabled': return for container in self.containers: new_enabled = (container.name in new_value) if new_enabled == container.enabled: continue logger.info('Extension "%s" is now %s', container.name, 'enabled' if new_enabled else 'disabled') container.set_enabled(new_enabled) if new_enabled and not container.enabled: logger.warn('Could not enable extension: %s', container.error) self.core.config.extensions.enabled = [x for x in self.core.config.extensions.enabled if x != container.name] def _find_extensions(self): extensions = {} if not self.filenames: builtins = os.path.join(gpodder.prefix, 'share', 'gpodder', 'extensions', '*.py') user_extensions = os.path.join(gpodder.home, 'Extensions', '*.py') self.filenames = glob.glob(builtins) + glob.glob(user_extensions) # Let user extensions override built-in extensions of the same name for filename in self.filenames: if not filename or not os.path.exists(filename): logger.info('Skipping non-existing file: %s', filename) continue name, _ = os.path.splitext(os.path.basename(filename)) extensions[name] = filename return sorted(extensions.items()) def get_extensions(self): """Get a list of all loaded extensions and their enabled flag""" return [c for c in self.containers if c.metadata.available_for_current_ui and not c.metadata.mandatory_in_current_ui and not c.metadata.disable_in_current_ui] # Define all known handler functions here, decorate them with the # "call_extension" decorator to forward all calls to extension scripts that have # the same function defined in them. If the handler functions here contain # any code, it will be called after all the extensions have been called. @call_extensions def on_ui_initialized(self, model, update_podcast_callback, download_episode_callback): """Called when the user interface is initialized. @param model: A gpodder.model.Model instance @param update_podcast_callback: Function to update a podcast feed @param download_episode_callback: Function to download an episode """ pass @call_extensions def on_podcast_subscribe(self, podcast): """Called when the user subscribes to a new podcast feed. @param podcast: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_podcast_updated(self, podcast): """Called when a podcast feed was updated This extension will be called even if there were no new episodes. @param podcast: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_podcast_update_failed(self, podcast, exception): """Called when a podcast update failed. @param podcast: A gpodder.model.PodcastChannel instance @param exception: The reason. """ pass @call_extensions def on_podcast_save(self, podcast): """Called when a podcast is saved to the database This extensions will be called when the user edits the metadata of the podcast or when the feed was updated. @param podcast: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_podcast_delete(self, podcast): """Called when a podcast is deleted from the database @param podcast: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_episode_playback(self, episode): """Called when an episode is played back This function will be called when the user clicks on "Play" or "Open" in the GUI to open an episode with the media player. @param episode: A gpodder.model.PodcastEpisode instance """ pass @call_extensions def on_episode_save(self, episode): """Called when an episode is saved to the database This extension will be called when a new episode is added to the database or when the state of an existing episode is changed. @param episode: A gpodder.model.PodcastEpisode instance """ pass @call_extensions def on_episode_downloaded(self, episode): """Called when an episode has been downloaded You can retrieve the filename via episode.local_filename(False) @param episode: A gpodder.model.PodcastEpisode instance """ pass @call_extensions def on_all_episodes_downloaded(self): """Called when all episodes has been downloaded """ pass @call_extensions def on_episodes_context_menu(self, episodes): """Called when the episode list context menu is opened You can add additional context menu entries here. You have to return a list of tuples, where the first item is a label and the second item is a callable that will get the episode as its first and only parameter. Example return value: [('Mark as new', lambda episodes: ...)] @param episodes: A list of gpodder.model.PodcastEpisode instances """ pass @call_extensions def on_channel_context_menu(self, channel): """Called when the channel list context menu is opened You can add additional context menu entries here. You have to return a list of tuples, where the first item is a label and the second item is a callable that will get the channel as its first and only parameter. Example return value: [('Update channel', lambda channel: ...)] @param channel: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_episode_delete(self, episode, filename): """Called just before the episode's disk file is about to be deleted.""" pass @call_extensions def on_episode_removed_from_podcast(self, episode): """Called just before the episode is about to be removed from the podcast channel, e.g., when the episode has not been downloaded and it disappears from the feed. @param podcast: A gpodder.model.PodcastChannel instance """ pass @call_extensions def on_notification_show(self, title, message): """Called when a notification should be shown @param title: title of the notification @param message: message of the notification """ pass @call_extensions def on_download_progress(self, progress): """Called when the overall download progress changes @param progress: The current progress value (0..1) """ pass @call_extensions def on_ui_object_available(self, name, ui_object): """Called when an UI-specific object becomes available XXX: Experimental. This hook might go away without notice (and be replaced with something better). Only use for in-tree extensions. @param name: The name/ID of the object @param ui_object: The object itself """ pass gpodder-3.5.2/src/gpodder/feedcore.py0000644000175000017500000002367012220076757017136 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # Generic feed fetching module for aggregators # Thomas Perl ; 2009-06-11 # import feedparser import logging logger = logging.getLogger(__name__) try: # Python 2 from rfc822 import mktime_tz except ImportError: # Python 3 from email.utils import mktime_tz # Version check to avoid bug 1648 feedparser_version = tuple(int(x) if x.isdigit() else x for x in feedparser.__version__.split('.')) feedparser_miniumum_version = (5, 1, 2) if feedparser_version < feedparser_miniumum_version: installed_version = feedparser.__version__ required_version = '.'.join(str(x) for x in feedparser_miniumum_version) logger.warn('Your feedparser is too old. Installed: %s, recommended: %s', installed_version, required_version) def patch_feedparser(): """Monkey-patch the Universal Feed Parser""" # Detect the 'plain' content type as 'text/plain' # http://code.google.com/p/feedparser/issues/detail?id=80 def mapContentType2(self, contentType): contentType = contentType.lower() if contentType == 'text' or contentType == 'plain': contentType = 'text/plain' elif contentType == 'html': contentType = 'text/html' elif contentType == 'xhtml': contentType = 'application/xhtml+xml' return contentType try: if feedparser._FeedParserMixin().mapContentType('plain') == 'plain': feedparser._FeedParserMixin.mapContentType = mapContentType2 except: pass # Fix parsing of Media RSS with feedparser, as described here: # http://code.google.com/p/feedparser/issues/detail?id=100#c4 def _start_media_content(self, attrsD): context = self._getContext() context.setdefault('media_content', []) context['media_content'].append(attrsD) try: feedparser._FeedParserMixin._start_media_content = _start_media_content except: pass # Fix problem with the EA.com official podcast # https://bugs.gpodder.org/show_bug.cgi?id=588 if '*/*' not in feedparser.ACCEPT_HEADER.split(','): feedparser.ACCEPT_HEADER += ',*/*' # Fix problem with YouTube feeds and pubDate/atom:modified # https://bugs.gpodder.org/show_bug.cgi?id=1492 # http://code.google.com/p/feedparser/issues/detail?id=310 def _end_updated(self): value = self.pop('updated') parsed_value = feedparser._parse_date(value) overwrite = ('youtube.com' not in self.baseuri) try: self._save('updated_parsed', parsed_value, overwrite=overwrite) except TypeError, te: logger.warn('Your feedparser version is too old: %s', te) try: feedparser._FeedParserMixin._end_updated = _end_updated except: pass patch_feedparser() class ExceptionWithData(Exception): """Base exception with additional payload""" def __init__(self, data): Exception.__init__(self) self.data = data def __str__(self): return '%s: %s' % (self.__class__.__name__, str(self.data)) # Temporary errors class Offline(Exception): pass class BadRequest(Exception): pass class InternalServerError(Exception): pass class WifiLogin(ExceptionWithData): pass # Fatal errors class Unsubscribe(Exception): pass class NotFound(Exception): pass class InvalidFeed(Exception): pass class UnknownStatusCode(ExceptionWithData): pass # Authentication error class AuthenticationRequired(Exception): pass # Successful status codes UPDATED_FEED, NEW_LOCATION, NOT_MODIFIED, CUSTOM_FEED = range(4) class Result: def __init__(self, status, feed=None): self.status = status self.feed = feed class Fetcher(object): # Supported types, see http://feedvalidator.org/docs/warning/EncodingMismatch.html FEED_TYPES = ('application/rss+xml', 'application/atom+xml', 'application/rdf+xml', 'application/xml', 'text/xml') def __init__(self, user_agent): self.user_agent = user_agent def _resolve_url(self, url): """Provide additional ways of resolving an URL Subclasses can override this method to provide more ways of resolving a given URL to a feed URL. If the Fetcher is in "autodiscovery" mode, it will try this method as a last resort for coming up with a feed URL. """ return None def _autodiscover_feed(self, feed): # First, try all elements if available for link in feed.feed.get('links', ()): is_feed = link.get('type', '') in self.FEED_TYPES is_alternate = link.get('rel', '') == 'alternate' url = link.get('href', None) if url and is_feed and is_alternate: try: return self._parse_feed(url, None, None, False) except Exception, e: pass # Second, try to resolve the URL url = self._resolve_url(feed.href) if url: result = self._parse_feed(url, None, None, False) result.status = NEW_LOCATION return result def _check_offline(self, feed): if not hasattr(feed, 'headers'): raise Offline() def _check_wifi_login_page(self, feed): html_page = 'text/html' in feed.headers.get('content-type', '') if not feed.version and feed.status == 302 and html_page: raise WifiLogin(feed.href) def _check_valid_feed(self, feed): if feed is None: raise InvalidFeed('feed is None') if not hasattr(feed, 'status'): raise InvalidFeed('feed has no status code') if not feed.version and feed.status != 304 and feed.status != 401: raise InvalidFeed('unknown feed type') def _normalize_status(self, status): # Based on Mark Pilgrim's "Atom aggregator behaviour" article if status in (200, 301, 302, 304, 400, 401, 403, 404, 410, 500): return status elif status >= 200 and status < 300: return 200 elif status >= 300 and status < 400: return 302 elif status >= 400 and status < 500: return 400 elif status >= 500 and status < 600: return 500 else: return status def _check_rss_redirect(self, feed): new_location = feed.feed.get('newlocation', None) if new_location: feed.href = feed.feed.newlocation return Result(NEW_LOCATION, feed) return None def _check_statuscode(self, feed): status = self._normalize_status(feed.status) if status == 200: return Result(UPDATED_FEED, feed) elif status == 301: return Result(NEW_LOCATION, feed) elif status == 302: return Result(UPDATED_FEED, feed) elif status == 304: return Result(NOT_MODIFIED, feed) if status == 400: raise BadRequest('bad request') elif status == 401: raise AuthenticationRequired('authentication required') elif status == 403: raise Unsubscribe('forbidden') elif status == 404: raise NotFound('not found') elif status == 410: raise Unsubscribe('resource is gone') elif status == 500: raise InternalServerError('internal server error') else: raise UnknownStatusCode(status) def _parse_feed(self, url, etag, modified, autodiscovery=True): if url.startswith('file://'): is_local = True url = url[len('file://'):] else: is_local = False feed = feedparser.parse(url, agent=self.user_agent, modified=modified, etag=etag) if is_local: if feed.version: feed.headers = {} return Result(UPDATED_FEED, feed) else: raise InvalidFeed('Not a valid feed file') else: self._check_offline(feed) self._check_wifi_login_page(feed) if feed.status != 304 and not feed.version and autodiscovery: feed = self._autodiscover_feed(feed).feed self._check_valid_feed(feed) redirect = self._check_rss_redirect(feed) if redirect is not None: return redirect return self._check_statuscode(feed) def fetch(self, url, etag=None, modified=None): return self._parse_feed(url, etag, modified) def get_pubdate(entry): """Try to determine the real pubDate of a feedparser entry This basically takes the updated_parsed value, but also uses some more advanced techniques to work around various issues with ugly feeds. "published" now also takes precedence over "updated" (with updated used as a fallback if published is not set/available). RSS' "pubDate" element is "updated", and will only be used if published_parsed is not available. """ pubdate = entry.get('published_parsed', None) if pubdate is None: pubdate = entry.get('updated_parsed', None) if pubdate is None: # Cannot determine pubdate - party like it's 1970! return 0 return mktime_tz(pubdate + (0,)) gpodder-3.5.2/src/gpodder/feedservice.py0000644000175000017500000000532312220076757017641 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from mygpoclient import feeds import logging logger = logging.getLogger(__name__) def parse_entry(podcast, entry): download_url = entry['default_file']['url'] return podcast.episode_factory({ 'title': entry['title'], 'description': entry.get('description', ''), 'url': download_url, 'mime_type': entry['default_file']['mime_type'], 'file_size': entry.get('filesize', -1), 'guid': entry.get('guid', download_url), 'link': entry.get('link', ''), 'published': entry.get('released', 0), 'total_time': entry.get('duration', 0), }) def update_using_feedservice(podcasts): urls = [podcast.url for podcast in podcasts] client = feeds.FeedserviceClient() # Last modified + logo/etc.. result = client.parse_feeds(urls) for podcast in podcasts: feed = result.get_feed(podcast.url) if feed is None: logger.info('Feed not updated: %s', podcast.url) continue # Handle permanent redirects if feed.get('new_location', False): new_url = feed['new_location'] logger.info('Redirect %s => %s', podcast.url, new_url) podcast.url = new_url # Error handling if feed.get('errors', False): logger.error('Error parsing feed: %s', repr(feed['errors'])) continue # Update per-podcast metadata podcast.title = feed.get('title', podcast.url) podcast.link = feed.get('link', podcast.link) podcast.description = feed.get('description', podcast.description) podcast.cover_url = feed.get('logo', podcast.cover_url) #podcast.http_etag = feed.get('http_etag', podcast.http_etag) #podcast.http_last_modified = feed.get('http_last_modified', \ # podcast.http_last_modified) podcast.save() # Update episodes parsed_episodes = [parse_entry(podcast, entry) for entry in feed['episodes']] # ... gpodder-3.5.2/src/gpodder/flattr.py0000644000175000017500000001660512220076757016656 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # flattr.py -- gPodder Flattr integration # Bernd Schlapsi 2012-05-26 # import atexit import os import urllib import urllib2 import urlparse import json import logging logger = logging.getLogger(__name__) from gpodder import minidb from gpodder import util import gpodder _ = gpodder.gettext class FlattrAction(object): __slots__ = {'url': str} def __init__(self, url): self.url = url class Flattr(object): STORE_FILE = 'flattr.cache' KEY = 'DD2bUSu1TJ7voHz9yNgtC7ld54lKg29Kw2MhL68uG5QUCgT1UZkmXvpSqBtxut7R' SECRET = 'lJYWGXhcTXWm4FdOvn0iJg1ZIkm3DkKPTzCpmJs5xehrKk55yWe736XCg9vKj5p3' CALLBACK = 'http://gpodder.org/flattr/token.html' GPODDER_THING = ('https://flattr.com/submit/auto?' + 'user_id=thp&url=http://gpodder.org/') # OAuth URLs OAUTH_BASE = 'https://flattr.com/oauth' AUTH_URL_TEMPLATE = (OAUTH_BASE + '/authorize?scope=flattr&' + 'response_type=code&client_id=%(client_id)s&' + 'redirect_uri=%(redirect_uri)s') OAUTH_TOKEN_URL = OAUTH_BASE + '/token' # REST API URLs API_BASE = 'https://api.flattr.com/rest/v2' USER_INFO_URL = API_BASE + '/user' FLATTR_URL = API_BASE + '/flattr' THING_INFO_URL_TEMPLATE = API_BASE + '/things/lookup/?url=%(url)s' def __init__(self, config): self._config = config self._store = minidb.Store(os.path.join(gpodder.home, self.STORE_FILE)) self._worker_thread = None atexit.register(self._at_exit) def _at_exit(self): self._worker_proc() self._store.close() def _worker_proc(self): self._store.commit() if not self.api_reachable(): self._worker_thread = None return logger.debug('Processing stored flattr actions...') for flattr_action in self._store.load(FlattrAction): success, message = self.flattr_url(flattr_action.url) if success: self._store.remove(flattr_action) self._store.commit() self._worker_thread = None def api_reachable(self): reachable, response = util.website_reachable(self.API_BASE) if not reachable: return False try: content = response.readline() content = json.loads(content) if 'message' in content and content['message'] == 'hello_world': return True except ValueError as err: pass return False def request(self, url, data=None): headers = {'Content-Type': 'application/json'} if url == self.OAUTH_TOKEN_URL: # Inject username and password into the request URL url = util.url_add_authentication(url, self.KEY, self.SECRET) elif self._config.token: headers['Authorization'] = 'Bearer ' + self._config.token if data is not None: data = json.dumps(data) try: response = util.urlopen(url, headers, data) except urllib2.HTTPError, error: return {'_gpodder_statuscode': error.getcode()} except urllib2.URLError, error: return {'_gpodder_no_connection': False} if response.getcode() == 200: return json.loads(response.read()) return {'_gpodder_statuscode': response.getcode()} def get_auth_url(self): return self.AUTH_URL_TEMPLATE % { 'client_id': self.KEY, 'redirect_uri': self.CALLBACK, } def has_token(self): return bool(self._config.token) def process_retrieved_code(self, url): url_parsed = urlparse.urlparse(url) query = urlparse.parse_qs(url_parsed.query) if 'code' in query: code = query['code'][0] logger.info('Got code: %s', code) self._config.token = self._request_access_token(code) return True return False def _request_access_token(self, code): request_url = 'https://flattr.com/oauth/token' params = { 'code': code, 'grant_type': 'authorization_code', 'redirect_uri': self.CALLBACK, } content = self.request(self.OAUTH_TOKEN_URL, data=params) return content.get('access_token', '') def get_thing_info(self, payment_url): """Get information about a Thing on Flattr Return a tuple (flattrs, flattred): flattrs ... The number of Flattrs this thing received flattred ... True if this user already flattred this thing """ if not self._config.token: return (0, False) quote_url = urllib.quote_plus(util.sanitize_encoding(payment_url)) url = self.THING_INFO_URL_TEMPLATE % {'url': quote_url} data = self.request(url) return (int(data.get('flattrs', 0)), bool(data.get('flattred', False))) def get_auth_username(self): if not self._config.token: return '' data = self.request(self.USER_INFO_URL) return data.get('username', '') def flattr_url(self, payment_url): """Flattr an object given its Flattr payment URL Returns a tuple (success, message): success ... True if the item was Flattr'd message ... The success or error message """ params = { 'url': payment_url } content = self.request(self.FLATTR_URL, data=params) if '_gpodder_statuscode' in content: status_code = content['_gpodder_statuscode'] if status_code == 401: return (False, _('Not enough means to flattr')) elif status_code == 404: return (False, _('Item does not exist on Flattr')) elif status_code == 403: return (True, _('Already flattred or own item')) else: return (False, _('Invalid request')) if '_gpodder_no_connection' in content: if not self._store.get(FlattrAction, url=payment_url): flattr_action = FlattrAction(payment_url) self._store.save(flattr_action) return (False, _('No internet connection')) if self._worker_thread is None: self._worker_thread = util.run_in_background(lambda: self._worker_proc(), True) return (True, content.get('description', _('No description'))) def is_flattr_url(self, url): if 'flattr.com' in url: return True return False def is_flattrable(self, url): if self._config.token and self.is_flattr_url(url): return True return False gpodder-3.5.2/src/gpodder/jsonconfig.py0000644000175000017500000001663412220076757017523 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # jsonconfig.py -- JSON Config Backend # Thomas Perl 2012-01-18 # import copy try: # For Python < 2.6, we use the "simplejson" add-on module import simplejson as json except ImportError: # Python 2.6 already ships with a nice "json" module import json class JsonConfigSubtree(object): def __init__(self, parent, name): self._parent = parent self._name = name def __repr__(self): return '' % (self._name,) def _attr(self, name): return '.'.join((self._name, name)) def __getitem__(self, name): return self._parent._lookup(self._name).__getitem__(name) def __delitem__(self, name): self._parent._lookup(self._name).__delitem__(name) def __setitem__(self, name, value): self._parent._lookup(self._name).__setitem__(name, value) def __getattr__(self, name): if name == 'keys': # Kludge for using dict() on a JsonConfigSubtree return getattr(self._parent._lookup(self._name), name) return getattr(self._parent, self._attr(name)) def __setattr__(self, name, value): if name.startswith('_'): object.__setattr__(self, name, value) else: self._parent.__setattr__(self._attr(name), value) class JsonConfig(object): _INDENT = 2 def __init__(self, data=None, default=None, on_key_changed=None): """ Create a new JsonConfig object data: A JSON string that contains the data to load (optional) default: A dict that contains default config values (optional) on_key_changed: Callback when a value changes (optional) The signature of on_key_changed looks like this: func(name, old_value, new_value) name: The key name, e.g. "ui.gtk.show_toolbar" old_value: The old value, e.g. False new_value: The new value, e.g. True For newly-set keys, on_key_changed is also called. In this case, None will be the old_value: >>> def callback(*args): print 'callback:', args >>> c = JsonConfig(on_key_changed=callback) >>> c.a.b = 10 callback: ('a.b', None, 10) >>> c.a.b = 11 callback: ('a.b', 10, 11) >>> c.x.y.z = [1,2,3] callback: ('x.y.z', None, [1, 2, 3]) >>> c.x.y.z = 42 callback: ('x.y.z', [1, 2, 3], 42) Please note that dict-style access will not call on_key_changed: >>> def callback(*args): print 'callback:', args >>> c = JsonConfig(on_key_changed=callback) >>> c.a.b = 1 # This works as expected callback: ('a.b', None, 1) >>> c.a['c'] = 10 # This doesn't call on_key_changed! >>> del c.a['c'] # This also doesn't call on_key_changed! """ self._default = default self._data = copy.deepcopy(self._default) or {} self._on_key_changed = on_key_changed if data is not None: self._restore(data) def _restore(self, backup): """ Restore a previous state saved with repr() This function allows you to "snapshot" the current values of the configuration and reload them later on. Any missing default values will be added on top of the restored config. Returns True if new keys from the default config have been added, False if no keys have been added (backup contains all default keys) >>> c = JsonConfig() >>> c.a.b = 10 >>> backup = repr(c) >>> print c.a.b 10 >>> c.a.b = 11 >>> print c.a.b 11 >>> c._restore(backup) False >>> print c.a.b 10 """ self._data = json.loads(backup) # Add newly-added default configuration options if self._default is not None: return self._merge_keys(self._default) return False def _merge_keys(self, merge_source): """Merge keys from merge_source into this config object Return True if new keys were merged, False otherwise """ added_new_key = False # Recurse into the data and add missing items work_queue = [(self._data, merge_source)] while work_queue: data, default = work_queue.pop() for key, value in default.iteritems(): if key not in data: # Copy defaults for missing key data[key] = copy.deepcopy(value) added_new_key = True elif isinstance(value, dict): # Recurse into sub-dictionaries work_queue.append((data[key], value)) elif type(value) != type(data[key]): # Type mismatch of current value and default if type(value) == int and type(data[key]) == float: # Convert float to int if default value is int data[key] = int(data[key]) return added_new_key def __repr__(self): """ >>> c = JsonConfig('{"a": 1}') >>> print c { "a": 1 } """ return json.dumps(self._data, indent=self._INDENT) def _lookup(self, name): return reduce(lambda d, k: d[k], name.split('.'), self._data) def _keys_iter(self): work_queue = [] work_queue.append(([], self._data)) while work_queue: path, data = work_queue.pop(0) if isinstance(data, dict): for key in sorted(data.keys()): work_queue.append((path + [key], data[key])) else: yield '.'.join(path) def __getattr__(self, name): try: value = self._lookup(name) if not isinstance(value, dict): return value except KeyError: pass return JsonConfigSubtree(self, name) def __setattr__(self, name, value): if name.startswith('_'): object.__setattr__(self, name, value) return attrs = name.split('.') target_dict = self._data while attrs: attr = attrs.pop(0) if not attrs: old_value = target_dict.get(attr, None) if old_value != value or attr not in target_dict: target_dict[attr] = value if self._on_key_changed is not None: self._on_key_changed(name, old_value, value) break target = target_dict.get(attr, None) if target is None or not isinstance(target, dict): target_dict[attr] = target = {} target_dict = target gpodder-3.5.2/src/gpodder/log.py0000644000175000017500000000624212220076757016137 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.log - Logging setup # Thomas Perl ; 2012-03-02 # Based on an initial draft by Neal Walfield import gpodder import glob import logging import os import sys import time import traceback logger = logging.getLogger(__name__) def setup(verbose=True): # Configure basic stdout logging STDOUT_FMT = '%(created)f [%(name)s] %(levelname)s: %(message)s' logging.basicConfig(format=STDOUT_FMT, level=logging.DEBUG if verbose else logging.WARNING) # Replace except hook with a custom one that logs it as an error original_excepthook = sys.excepthook def on_uncaught_exception(exctype, value, tb): message = ''.join(traceback.format_exception(exctype, value, tb)) logger.error('Uncaught exception: %s', message) original_excepthook(exctype, value, tb) sys.excepthook = on_uncaught_exception if os.environ.get('GPODDER_WRITE_LOGS', 'yes') != 'no': # Configure file based logging logging_basename = time.strftime('%Y-%m-%d.log') logging_directory = os.path.join(gpodder.home, 'Logs') if not os.path.isdir(logging_directory): try: os.makedirs(logging_directory) except: logger.warn('Cannot create output directory: %s', logging_directory) return False # Keep logs around for 5 days LOG_KEEP_DAYS = 5 # Purge old logfiles if they are older than LOG_KEEP_DAYS days old_logfiles = glob.glob(os.path.join(logging_directory, '*-*-*.log')) for old_logfile in old_logfiles: st = os.stat(old_logfile) if time.time() - st.st_mtime > 60*60*24*LOG_KEEP_DAYS: logger.info('Purging old logfile: %s', old_logfile) try: os.remove(old_logfile) except: logger.warn('Cannot purge logfile: %s', exc_info=True) root = logging.getLogger() logfile = os.path.join(logging_directory, logging_basename) file_handler = logging.FileHandler(logfile, 'a', 'utf-8') FILE_FMT = '%(asctime)s [%(name)s] %(levelname)s: %(message)s' file_handler.setFormatter(logging.Formatter(FILE_FMT)) root.addHandler(file_handler) logger.debug('==== gPodder starts up (ui=%s) ===', ', '.join(name for name in ('cli', 'gtk', 'qml') if getattr(gpodder.ui, name, False))) return True gpodder-3.5.2/src/gpodder/minidb.py0000644000175000017500000001651312220076757016622 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.minidb - A simple SQLite store for Python objects # Thomas Perl, 2010-01-28 # based on: "ORM wie eine Kirchenmaus - a very poor ORM implementation # by thp, 2009-11-29 (thp.io/about)" # This module is also available separately at: # http://thp.io/2010/minidb/ # For Python 2.5, we need to request the "with" statement from __future__ import with_statement try: import sqlite3.dbapi2 as sqlite except ImportError: try: from pysqlite2 import dbapi2 as sqlite except ImportError: raise Exception('Please install SQLite3 support.') import threading class Store(object): def __init__(self, filename=':memory:'): self.db = sqlite.connect(filename, check_same_thread=False) self.lock = threading.RLock() def _schema(self, class_): return class_.__name__, list(sorted(class_.__slots__)) def _set(self, o, slot, value): # Set a slot on the given object to value, doing a cast if # necessary. The value None is special-cased and never cast. cls = o.__class__.__slots__[slot] if value is not None: if isinstance(value, unicode): value = value.decode('utf-8') value = cls(value) setattr(o, slot, value) def commit(self): with self.lock: self.db.commit() def close(self): with self.lock: self.db.execute('VACUUM') self.db.close() def _register(self, class_): with self.lock: table, slots = self._schema(class_) cur = self.db.execute('PRAGMA table_info(%s)' % table) available = cur.fetchall() if available: available = [row[1] for row in available] missing_slots = (s for s in slots if s not in available) for slot in missing_slots: self.db.execute('ALTER TABLE %s ADD COLUMN %s TEXT' % (table, slot)) else: self.db.execute('CREATE TABLE %s (%s)' % (table, ', '.join('%s TEXT'%s for s in slots))) def convert(self, v): if isinstance(v, unicode): return v elif isinstance(v, str): # XXX: Rewrite ^^^ as "isinstance(v, bytes)" in Python 3 return v.decode('utf-8') else: return str(v) def update(self, o, **kwargs): self.remove(o) for k, v in kwargs.items(): setattr(o, k, v) self.save(o) def save(self, o): if hasattr(o, '__iter__'): klass = None for child in o: if klass is None: klass = child.__class__ self._register(klass) table, slots = self._schema(klass) if not isinstance(child, klass): raise ValueError('Only one type of object allowed') used = [s for s in slots if getattr(child, s, None) is not None] values = [self.convert(getattr(child, slot)) for slot in used] self.db.execute('INSERT INTO %s (%s) VALUES (%s)' % (table, ', '.join(used), ', '.join('?'*len(used))), values) return with self.lock: self._register(o.__class__) table, slots = self._schema(o.__class__) values = [self.convert(getattr(o, slot)) for slot in slots] self.db.execute('INSERT INTO %s (%s) VALUES (%s)' % (table, ', '.join(slots), ', '.join('?'*len(slots))), values) def delete(self, class_, **kwargs): with self.lock: self._register(class_) table, slots = self._schema(class_) sql = 'DELETE FROM %s' % (table,) if kwargs: sql += ' WHERE %s' % (' AND '.join('%s=?' % k for k in kwargs)) try: self.db.execute(sql, kwargs.values()) return True except Exception, e: return False def remove(self, o): if hasattr(o, '__iter__'): for child in o: self.remove(child) return with self.lock: self._register(o.__class__) table, slots = self._schema(o.__class__) # Use "None" as wildcard selector in remove actions slots = [s for s in slots if getattr(o, s, None) is not None] values = [self.convert(getattr(o, slot)) for slot in slots] self.db.execute('DELETE FROM %s WHERE %s' % (table, ' AND '.join('%s=?'%s for s in slots)), values) def load(self, class_, **kwargs): with self.lock: self._register(class_) table, slots = self._schema(class_) sql = 'SELECT %s FROM %s' % (', '.join(slots), table) if kwargs: sql += ' WHERE %s' % (' AND '.join('%s=?' % k for k in kwargs)) try: cur = self.db.execute(sql, kwargs.values()) except Exception, e: raise def apply(row): o = class_.__new__(class_) for attr, value in zip(slots, row): try: self._set(o, attr, value) except ValueError, ve: return None return o return filter(lambda x: x is not None, [apply(row) for row in cur]) def get(self, class_, **kwargs): result = self.load(class_, **kwargs) if result: return result[0] else: return None if __name__ == '__main__': class Person(object): __slots__ = {'username': str, 'id': int} def __init__(self, username, id): self.username = username self.id = id def __repr__(self): return '' % (self.username, self.id) m = Store() m.save(Person('User %d' % x, x*20) for x in range(50)) p = m.get(Person, id=200) print p m.remove(p) p = m.get(Person, id=200) # Remove some persons again (deletion by value!) m.remove(Person('User %d' % x, x*20) for x in range(40)) class Person(object): __slots__ = {'username': str, 'id': int, 'mail': str} def __init__(self, username, id, mail): self.username = username self.id = id self.mail = mail def __repr__(self): return '' % (self.username, self.mail) # A schema update takes place here m.save(Person('User %d' % x, x*20, 'user@home.com') for x in range(50)) print m.load(Person) gpodder-3.5.2/src/gpodder/model.py0000644000175000017500000014411012220076757016453 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # Copyright (c) 2011 Neal H. Walfield # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.model - Core model classes for gPodder (2009-08-13) # Based on libpodcasts.py (thp, 2005-10-29) # import gpodder from gpodder import util from gpodder import feedcore from gpodder import youtube from gpodder import vimeo from gpodder import schema from gpodder import coverart import logging logger = logging.getLogger(__name__) import os import re import glob import shutil import time import datetime import hashlib import feedparser import collections import string _ = gpodder.gettext def get_payment_priority(url): """ at the moment we only support flattr.com as an payment provider, so we sort the payment providers and prefer flattr.com ("1" is higher priority than "2") """ if 'flattr.com' in url: return 1 return 2 class CustomFeed(feedcore.ExceptionWithData): pass class gPodderFetcher(feedcore.Fetcher): """ This class extends the feedcore Fetcher with the gPodder User-Agent and the Proxy handler based on the current settings in gPodder. """ custom_handlers = [] def __init__(self): feedcore.Fetcher.__init__(self, gpodder.user_agent) def fetch_channel(self, channel): etag = channel.http_etag modified = feedparser._parse_date(channel.http_last_modified) # If we have a username or password, rebuild the url with them included # Note: using a HTTPBasicAuthHandler would be pain because we need to # know the realm. It can be done, but I think this method works, too url = channel.authenticate_url(channel.url) for handler in self.custom_handlers: custom_feed = handler.handle_url(url) if custom_feed is not None: return feedcore.Result(feedcore.CUSTOM_FEED, custom_feed) return self.fetch(url, etag, modified) def _resolve_url(self, url): url = youtube.get_real_channel_url(url) url = vimeo.get_real_channel_url(url) return url @classmethod def register(cls, handler): cls.custom_handlers.append(handler) # The "register" method is exposed here for external usage register_custom_handler = gPodderFetcher.register # Our podcast model: # # database -> podcast -> episode -> download/playback # podcast.parent == db # podcast.children == [episode, ...] # episode.parent == podcast # # - normally: episode.children = (None, None) # - downloading: episode.children = (DownloadTask(), None) # - playback: episode.children = (None, PlaybackTask()) class PodcastModelObject(object): """ A generic base class for our podcast model providing common helper and utility functions. """ __slots__ = ('id', 'parent', 'children') @classmethod def create_from_dict(cls, d, *args): """ Create a new object, passing "args" to the constructor and then updating the object with the values from "d". """ o = cls(*args) # XXX: all(map(lambda k: hasattr(o, k), d))? for k, v in d.iteritems(): setattr(o, k, v) return o class PodcastEpisode(PodcastModelObject): """holds data for one object in a channel""" MAX_FILENAME_LENGTH = 200 __slots__ = schema.EpisodeColumns def _deprecated(self): raise Exception('Property is deprecated!') is_played = property(fget=_deprecated, fset=_deprecated) is_locked = property(fget=_deprecated, fset=_deprecated) def has_website_link(self): return bool(self.link) and (self.link != self.url or \ youtube.is_video_link(self.link)) @classmethod def from_feedparser_entry(cls, entry, channel): episode = cls(channel) episode.guid = entry.get('id', '') # Replace multi-space and newlines with single space (Maemo bug 11173) episode.title = re.sub('\s+', ' ', entry.get('title', '')) episode.link = entry.get('link', '') if 'content' in entry and len(entry['content']) and \ entry['content'][0].get('type', '') == 'text/html': episode.description = entry['content'][0].value else: episode.description = entry.get('summary', '') # Fallback to subtitle if summary is not available if not episode.description: episode.description = entry.get('subtitle', '') try: total_time = 0 # Parse iTunes-specific podcast duration metadata itunes_duration = entry.get('itunes_duration', '') if itunes_duration: total_time = util.parse_time(itunes_duration) # Parse time from YouTube descriptions if it's a YouTube feed if youtube.is_youtube_guid(episode.guid): result = re.search(r'Time:<[^>]*>\n<[^>]*>([:0-9]*)<', episode.description) if result: youtube_duration = result.group(1) total_time = util.parse_time(youtube_duration) episode.total_time = total_time except: pass episode.published = feedcore.get_pubdate(entry) enclosures = entry.get('enclosures', []) media_rss_content = entry.get('media_content', []) audio_available = any(e.get('type', '').startswith('audio/') \ for e in enclosures + media_rss_content) video_available = any(e.get('type', '').startswith('video/') \ for e in enclosures + media_rss_content) # XXX: Make it possible for hooks/extensions to override this by # giving them a list of enclosures and the "self" object (podcast) # and letting them sort and/or filter the list of enclosures to # get the desired enclosure picked by the algorithm below. filter_and_sort_enclosures = lambda x: x # read the flattr auto-url, if exists payment_info = [link['href'] for link in entry.get('links', []) if link['rel'] == 'payment'] if payment_info: episode.payment_url = sorted(payment_info, key=get_payment_priority)[0] # Enclosures for e in filter_and_sort_enclosures(enclosures): episode.mime_type = e.get('type', 'application/octet-stream') if episode.mime_type == '': # See Maemo bug 10036 logger.warn('Fixing empty mimetype in ugly feed') episode.mime_type = 'application/octet-stream' if '/' not in episode.mime_type: continue # Skip images in feeds if audio or video is available (bug 979) # This must (and does) also look in Media RSS enclosures (bug 1430) if episode.mime_type.startswith('image/') and \ (audio_available or video_available): continue # If we have audio or video available later on, skip # 'application/octet-stream' data types (fixes Linux Outlaws) if episode.mime_type == 'application/octet-stream' and \ (audio_available or video_available): continue episode.url = util.normalize_feed_url(e.get('href', '')) if not episode.url: continue try: episode.file_size = int(e.length) or -1 except: episode.file_size = -1 return episode # Media RSS content for m in filter_and_sort_enclosures(media_rss_content): episode.mime_type = m.get('type', 'application/octet-stream') if '/' not in episode.mime_type: continue # Skip images in Media RSS if we have audio/video (bug 1444) if episode.mime_type.startswith('image/') and \ (audio_available or video_available): continue episode.url = util.normalize_feed_url(m.get('url', '')) if not episode.url: continue try: episode.file_size = int(m.get('filesize', 0)) or -1 except: episode.file_size = -1 try: episode.total_time = int(m.get('duration', 0)) or 0 except: episode.total_time = 0 return episode # Brute-force detection of any links for l in entry.get('links', ()): episode.url = util.normalize_feed_url(l.get('href', '')) if not episode.url: continue if (youtube.is_video_link(episode.url) or \ vimeo.is_video_link(episode.url)): return episode # Check if we can resolve this link to a audio/video file filename, extension = util.filename_from_url(episode.url) file_type = util.file_type_by_extension(extension) if file_type is None and hasattr(l, 'type'): extension = util.extension_from_mimetype(l.type) file_type = util.file_type_by_extension(extension) # The link points to a audio or video file - use it! if file_type is not None: return episode return None def __init__(self, channel): self.parent = channel self.podcast_id = self.parent.id self.children = (None, None) self.id = None self.url = '' self.title = '' self.file_size = 0 self.mime_type = 'application/octet-stream' self.guid = '' self.description = '' self.link = '' self.published = 0 self.download_filename = None self.payment_url = None self.state = gpodder.STATE_NORMAL self.is_new = True self.archive = channel.auto_archive_episodes # Time attributes self.total_time = 0 self.current_position = 0 self.current_position_updated = 0 # Timestamp of last playback time self.last_playback = 0 @property def channel(self): return self.parent @property def db(self): return self.parent.parent.db @property def trimmed_title(self): """Return the title with the common prefix trimmed""" # Minimum amount of leftover characters after trimming. This # avoids things like "Common prefix 123" to become just "123". # If there are LEFTOVER_MIN or less characters after trimming, # the original title will be returned without trimming. LEFTOVER_MIN = 5 # "Podcast Name - Title" and "Podcast Name: Title" -> "Title" for postfix in (' - ', ': '): prefix = self.parent.title + postfix if (self.title.startswith(prefix) and len(self.title)-len(prefix) > LEFTOVER_MIN): return self.title[len(prefix):] regex_patterns = [ # "Podcast Name : ..." -> ": ..." r'^%s (\d+: .*)' % re.escape(self.parent.title), # "Episode : ..." -> ": ..." r'Episode (\d+:.*)', ] for pattern in regex_patterns: if re.match(pattern, self.title): title = re.sub(pattern, r'\1', self.title) if len(title) > LEFTOVER_MIN: return title # "#001: Title" -> "001: Title" if (not self.parent._common_prefix and re.match('^#\d+: ', self.title) and len(self.title)-1 > LEFTOVER_MIN): return self.title[1:] if (self.parent._common_prefix is not None and self.title.startswith(self.parent._common_prefix) and len(self.title)-len(self.parent._common_prefix) > LEFTOVER_MIN): return self.title[len(self.parent._common_prefix):] return self.title def _set_download_task(self, download_task): self.children = (download_task, self.children[1]) def _get_download_task(self): return self.children[0] download_task = property(_get_download_task, _set_download_task) @property def downloading(self): task = self.download_task if task is None: return False return task.status in (task.DOWNLOADING, task.QUEUED, task.PAUSED) def check_is_new(self): return (self.state == gpodder.STATE_NORMAL and self.is_new and not self.downloading) def save(self): gpodder.user_extensions.on_episode_save(self) self.db.save_episode(self) def on_downloaded(self, filename): self.state = gpodder.STATE_DOWNLOADED self.is_new = True self.file_size = os.path.getsize(filename) self.save() def set_state(self, state): self.state = state self.save() def playback_mark(self): self.is_new = False self.last_playback = int(time.time()) gpodder.user_extensions.on_episode_playback(self) self.save() def mark(self, state=None, is_played=None, is_locked=None): if state is not None: self.state = state if is_played is not None: self.is_new = not is_played # "Mark as new" must "undelete" the episode if self.is_new and self.state == gpodder.STATE_DELETED: self.state = gpodder.STATE_NORMAL if is_locked is not None: self.archive = is_locked self.save() def age_in_days(self): return util.file_age_in_days(self.local_filename(create=False, \ check_only=True)) age_int_prop = property(fget=age_in_days) def get_age_string(self): return util.file_age_to_string(self.age_in_days()) age_prop = property(fget=get_age_string) @property def description_html(self): # XXX: That's not a very well-informed heuristic to check # if the description already contains HTML. Better ideas? if '<' in self.description: return self.description return self.description.replace('\n', '
      ') def one_line_description(self): MAX_LINE_LENGTH = 120 desc = util.remove_html_tags(self.description or '') desc = re.sub('\s+', ' ', desc).strip() if not desc: return _('No description available') else: # Decode the description to avoid gPodder bug 1277 desc = util.convert_bytes(desc).strip() if len(desc) > MAX_LINE_LENGTH: return desc[:MAX_LINE_LENGTH] + '...' else: return desc def delete_from_disk(self): filename = self.local_filename(create=False, check_only=True) if filename is not None: gpodder.user_extensions.on_episode_delete(self, filename) util.delete_file(filename) self.set_state(gpodder.STATE_DELETED) def get_playback_url(self, fmt_ids=None, allow_partial=False): """Local (or remote) playback/streaming filename/URL Returns either the local filename or a streaming URL that can be used to playback this episode. Also returns the filename of a partially downloaded file in case partial (preview) playback is desired. """ url = self.local_filename(create=False) if (allow_partial and url is not None and os.path.exists(url + '.partial')): return url + '.partial' if url is None or not os.path.exists(url): url = self.url url = youtube.get_real_download_url(url, fmt_ids) url = vimeo.get_real_download_url(url) return url def find_unique_file_name(self, filename, extension): # Remove leading and trailing whitespace + dots (to avoid hidden files) filename = filename.strip('.' + string.whitespace) + extension for name in util.generate_names(filename): if (not self.db.episode_filename_exists(self.podcast_id, name) or self.download_filename == name): return name def local_filename(self, create, force_update=False, check_only=False, template=None, return_wanted_filename=False): """Get (and possibly generate) the local saving filename Pass create=True if you want this function to generate a new filename if none exists. You only want to do this when planning to create/download the file after calling this function. Normally, you should pass create=False. This will only create a filename when the file already exists from a previous version of gPodder (where we used md5 filenames). If the file does not exist (and the filename also does not exist), this function will return None. If you pass force_update=True to this function, it will try to find a new (better) filename and move the current file if this is the case. This is useful if (during the download) you get more information about the file, e.g. the mimetype and you want to include this information in the file name generation process. If check_only=True is passed to this function, it will never try to rename the file, even if would be a good idea. Use this if you only want to check if a file exists. If "template" is specified, it should be a filename that is to be used as a template for generating the "real" filename. The generated filename is stored in the database for future access. If return_wanted_filename is True, the filename will not be written to the database, but simply returned by this function (for use by the "import external downloads" feature). """ if self.download_filename is None and (check_only or not create): return None ext = self.extension(may_call_local_filename=False).encode('utf-8', 'ignore') if not check_only and (force_update or not self.download_filename): # Avoid and catch gPodder bug 1440 and similar situations if template == '': logger.warn('Empty template. Report this podcast URL %s', self.channel.url) template = None # Try to find a new filename for the current file if template is not None: # If template is specified, trust the template's extension episode_filename, ext = os.path.splitext(template) else: episode_filename, _ = util.filename_from_url(self.url) fn_template = util.sanitize_filename(episode_filename, self.MAX_FILENAME_LENGTH) if 'redirect' in fn_template and template is None: # This looks like a redirection URL - force URL resolving! logger.warn('Looks like a redirection to me: %s', self.url) url = util.get_real_url(self.channel.authenticate_url(self.url)) logger.info('Redirection resolved to: %s', url) episode_filename, _ = util.filename_from_url(url) fn_template = util.sanitize_filename(episode_filename, self.MAX_FILENAME_LENGTH) # Use title for YouTube, Vimeo and Soundcloud downloads if (youtube.is_video_link(self.url) or vimeo.is_video_link(self.url) or fn_template == 'stream'): sanitized = util.sanitize_filename(self.title, self.MAX_FILENAME_LENGTH) if sanitized: fn_template = sanitized # If the basename is empty, use the md5 hexdigest of the URL if not fn_template or fn_template.startswith('redirect.'): logger.error('Report this feed: Podcast %s, episode %s', self.channel.url, self.url) fn_template = hashlib.md5(self.url).hexdigest() # Find a unique filename for this episode wanted_filename = self.find_unique_file_name(fn_template, ext) if return_wanted_filename: # return the calculated filename without updating the database return wanted_filename # The old file exists, but we have decided to want a different filename if self.download_filename and wanted_filename != self.download_filename: # there might be an old download folder crawling around - move it! new_file_name = os.path.join(self.channel.save_dir, wanted_filename) old_file_name = os.path.join(self.channel.save_dir, self.download_filename) if os.path.exists(old_file_name) and not os.path.exists(new_file_name): logger.info('Renaming %s => %s', old_file_name, new_file_name) os.rename(old_file_name, new_file_name) elif force_update and not os.path.exists(old_file_name): # When we call force_update, the file might not yet exist when we # call it from the downloading code before saving the file logger.info('Choosing new filename: %s', new_file_name) else: logger.warn('%s exists or %s does not', new_file_name, old_file_name) logger.info('Updating filename of %s to "%s".', self.url, wanted_filename) elif self.download_filename is None: logger.info('Setting download filename: %s', wanted_filename) self.download_filename = wanted_filename self.save() return os.path.join(util.sanitize_encoding(self.channel.save_dir), util.sanitize_encoding(self.download_filename)) def extension(self, may_call_local_filename=True): filename, ext = util.filename_from_url(self.url) if may_call_local_filename: filename = self.local_filename(create=False) if filename is not None: filename, ext = os.path.splitext(filename) # if we can't detect the extension from the url fallback on the mimetype if ext == '' or util.file_type_by_extension(ext) is None: ext = util.extension_from_mimetype(self.mime_type) return ext def mark_new(self): self.is_new = True self.save() def mark_old(self): self.is_new = False self.save() def file_exists(self): filename = self.local_filename(create=False, check_only=True) if filename is None: return False else: return os.path.exists(filename) def was_downloaded(self, and_exists=False): if self.state != gpodder.STATE_DOWNLOADED: return False if and_exists and not self.file_exists(): return False return True def sync_filename(self, use_custom=False, custom_format=None): if use_custom: return util.object_string_formatter(custom_format, episode=self, podcast=self.channel) else: return self.title def file_type(self): # Assume all YouTube/Vimeo links are video files if youtube.is_video_link(self.url) or vimeo.is_video_link(self.url): return 'video' return util.file_type_by_extension(self.extension()) @property def basename( self): return os.path.splitext( os.path.basename( self.url))[0] @property def pubtime(self): """ Returns published time as HHMM (or 0000 if not available) """ try: return datetime.datetime.fromtimestamp(self.published).strftime('%H%M') except: logger.warn('Cannot format pubtime: %s', self.title, exc_info=True) return '0000' def playlist_title(self): """Return a title for this episode in a playlist The title will be composed of the podcast name, the episode name and the publication date. The return value is the canonical representation of this episode in playlists (for example, M3U playlists). """ return '%s - %s (%s)' % (self.channel.title, \ self.title, \ self.cute_pubdate()) def cute_pubdate(self): result = util.format_date(self.published) if result is None: return '(%s)' % _('unknown') else: return result pubdate_prop = property(fget=cute_pubdate) def published_datetime(self): return datetime.datetime.fromtimestamp(self.published) @property def sortdate(self): return self.published_datetime().strftime('%Y-%m-%d') @property def pubdate_day(self): return self.published_datetime().strftime('%d') @property def pubdate_month(self): return self.published_datetime().strftime('%m') @property def pubdate_year(self): return self.published_datetime().strftime('%y') def is_finished(self): """Return True if this episode is considered "finished playing" An episode is considered "finished" when there is a current position mark on the track, and when the current position is greater than 99 percent of the total time or inside the last 10 seconds of a track. """ return self.current_position > 0 and self.total_time > 0 and \ (self.current_position + 10 >= self.total_time or \ self.current_position >= self.total_time*.99) def get_play_info_string(self, duration_only=False): duration = util.format_time(self.total_time) if duration_only and self.total_time > 0: return duration elif self.current_position > 0 and \ self.current_position != self.total_time: position = util.format_time(self.current_position) return '%s / %s' % (position, duration) elif self.total_time > 0: return duration else: return '-' def update_from(self, episode): for k in ('title', 'url', 'description', 'link', 'published', 'guid', 'file_size', 'payment_url'): setattr(self, k, getattr(episode, k)) class PodcastChannel(PodcastModelObject): __slots__ = schema.PodcastColumns + ('_common_prefix',) UNICODE_TRANSLATE = {ord(u'ö'): u'o', ord(u'ä'): u'a', ord(u'ü'): u'u'} # Enumerations for download strategy STRATEGY_DEFAULT, STRATEGY_LATEST = range(2) # Description and ordering of strategies STRATEGIES = [ (STRATEGY_DEFAULT, _('Default')), (STRATEGY_LATEST, _('Only keep latest')), ] MAX_FOLDERNAME_LENGTH = 60 SECONDS_PER_WEEK = 7*24*60*60 EpisodeClass = PodcastEpisode feed_fetcher = gPodderFetcher() def __init__(self, model, id=None): self.parent = model self.children = [] self.id = id self.url = None self.title = '' self.link = '' self.description = '' self.cover_url = None self.payment_url = None self.auth_username = '' self.auth_password = '' self.http_last_modified = None self.http_etag = None self.auto_archive_episodes = False self.download_folder = None self.pause_subscription = False self.sync_to_mp3_player = True self.section = _('Other') self._common_prefix = None self.download_strategy = PodcastChannel.STRATEGY_DEFAULT if self.id: self.children = self.db.load_episodes(self, self.episode_factory) self._determine_common_prefix() @property def model(self): return self.parent @property def db(self): return self.parent.db def get_download_strategies(self): for value, caption in PodcastChannel.STRATEGIES: yield self.download_strategy == value, value, caption def set_download_strategy(self, download_strategy): if download_strategy == self.download_strategy: return caption = dict(self.STRATEGIES).get(download_strategy) if caption is not None: logger.debug('Strategy for %s changed to %s', self.title, caption) self.download_strategy = download_strategy else: logger.warn('Cannot set strategy to %d', download_strategy) def check_download_folder(self): """Check the download folder for externally-downloaded files This will try to assign downloaded files with episodes in the database. This will also cause missing files to be marked as deleted. """ known_files = set() for episode in self.get_episodes(gpodder.STATE_DOWNLOADED): if episode.was_downloaded(): filename = episode.local_filename(create=False) if not os.path.exists(filename): # File has been deleted by the user - simulate a # delete event (also marks the episode as deleted) logger.debug('Episode deleted: %s', filename) episode.delete_from_disk() continue known_files.add(filename) existing_files = set(filename for filename in \ glob.glob(os.path.join(self.save_dir, '*')) \ if not filename.endswith('.partial')) ignore_files = ['folder'+ext for ext in coverart.CoverDownloader.EXTENSIONS] external_files = existing_files.difference(list(known_files) + [os.path.join(self.save_dir, ignore_file) for ignore_file in ignore_files]) if not external_files: return all_episodes = self.get_all_episodes() for filename in external_files: found = False basename = os.path.basename(filename) existing = [e for e in all_episodes if e.download_filename == basename] if existing: existing = existing[0] logger.info('Importing external download: %s', filename) existing.on_downloaded(filename) continue for episode in all_episodes: wanted_filename = episode.local_filename(create=True, \ return_wanted_filename=True) if basename == wanted_filename: logger.info('Importing external download: %s', filename) episode.download_filename = basename episode.on_downloaded(filename) found = True break wanted_base, wanted_ext = os.path.splitext(wanted_filename) target_base, target_ext = os.path.splitext(basename) if wanted_base == target_base: # Filenames only differ by the extension wanted_type = util.file_type_by_extension(wanted_ext) target_type = util.file_type_by_extension(target_ext) # If wanted type is None, assume that we don't know # the right extension before the download (e.g. YouTube) # if the wanted type is the same as the target type, # assume that it's the correct file if wanted_type is None or wanted_type == target_type: logger.info('Importing external download: %s', filename) episode.download_filename = basename episode.on_downloaded(filename) found = True break if not found and not util.is_system_file(filename): logger.warn('Unknown external file: %s', filename) @classmethod def sort_key(cls, podcast): key = util.convert_bytes(podcast.title.lower()) return re.sub('^the ', '', key).translate(cls.UNICODE_TRANSLATE) @classmethod def load(cls, model, url, create=True, authentication_tokens=None,\ max_episodes=0): if isinstance(url, unicode): url = url.encode('utf-8') existing = filter(lambda p: p.url == url, model.get_podcasts()) if existing: return existing[0] if create: tmp = cls(model) tmp.url = url if authentication_tokens is not None: tmp.auth_username = authentication_tokens[0] tmp.auth_password = authentication_tokens[1] # Save podcast, so it gets an ID assigned before # updating the feed and adding saving episodes tmp.save() try: tmp.update(max_episodes) except Exception, e: logger.debug('Fetch failed. Removing buggy feed.') tmp.remove_downloaded() tmp.delete() raise # Determine the section in which this podcast should appear tmp.section = tmp._get_content_type() # Determine a new download folder now that we have the title tmp.get_save_dir(force_new=True) # Mark episodes as downloaded if files already exist (bug 902) tmp.check_download_folder() # Determine common prefix of episode titles tmp._determine_common_prefix() tmp.save() gpodder.user_extensions.on_podcast_subscribe(tmp) return tmp def episode_factory(self, d): """ This function takes a dictionary containing key-value pairs for episodes and returns a new PodcastEpisode object that is connected to this object. Returns: A new PodcastEpisode object """ return self.EpisodeClass.create_from_dict(d, self) def _consume_updated_title(self, new_title): # Replace multi-space and newlines with single space (Maemo bug 11173) new_title = re.sub('\s+', ' ', new_title).strip() # Only update the podcast-supplied title when we # don't yet have a title, or if the title is the # feed URL (e.g. we didn't find a title before). if not self.title or self.title == self.url: self.title = new_title # Start YouTube- and Vimeo-specific title FIX YOUTUBE_PREFIX = 'Uploads by ' VIMEO_PREFIX = 'Vimeo / ' if self.title.startswith(YOUTUBE_PREFIX): self.title = self.title[len(YOUTUBE_PREFIX):] + ' on YouTube' elif self.title.startswith(VIMEO_PREFIX): self.title = self.title[len(VIMEO_PREFIX):] + ' on Vimeo' # End YouTube- and Vimeo-specific title FIX def _consume_metadata(self, title, link, description, cover_url, payment_url): self._consume_updated_title(title) self.link = link self.description = description self.cover_url = cover_url self.payment_url = payment_url self.save() def _consume_custom_feed(self, custom_feed, max_episodes=0): self._consume_metadata(custom_feed.get_title(), custom_feed.get_link(), custom_feed.get_description(), custom_feed.get_image(), None) existing = self.get_all_episodes() existing_guids = [episode.guid for episode in existing] # Insert newly-found episodes into the database + local cache new_episodes, seen_guids = custom_feed.get_new_episodes(self, existing_guids) self.children.extend(new_episodes) self.remove_unreachable_episodes(existing, seen_guids, max_episodes) def _consume_updated_feed(self, feed, max_episodes=0): # Cover art URL if hasattr(feed.feed, 'image'): for attribute in ('href', 'url'): new_value = getattr(feed.feed.image, attribute, None) if new_value is not None: cover_url = new_value elif hasattr(feed.feed, 'icon'): cover_url = feed.feed.icon else: cover_url = None # Payment URL (Flattr auto-payment) information payment_info = [link['href'] for link in feed.feed.get('links', []) if link['rel'] == 'payment'] if payment_info: payment_url = sorted(payment_info, key=get_payment_priority)[0] else: payment_url = None self._consume_metadata(feed.feed.get('title', self.url), feed.feed.get('link', self.link), feed.feed.get('subtitle', self.description), cover_url, payment_url) # Load all episodes to update them properly. existing = self.get_all_episodes() # We have to sort the entries in descending chronological order, # because if the feed lists items in ascending order and has > # max_episodes old episodes, new episodes will not be shown. # See also: gPodder Bug 1186 entries = sorted(feed.entries, key=feedcore.get_pubdate, reverse=True) # We can limit the maximum number of entries that gPodder will parse if max_episodes > 0 and len(entries) > max_episodes: entries = entries[:max_episodes] # GUID-based existing episode list existing_guids = dict((e.guid, e) for e in existing) # Get most recent published of all episodes last_published = self.db.get_last_published(self) or 0 # Keep track of episode GUIDs currently seen in the feed seen_guids = set() # Number of new episodes found new_episodes = 0 # Search all entries for new episodes for entry in entries: episode = self.EpisodeClass.from_feedparser_entry(entry, self) if episode is not None: if not episode.title: logger.warn('Using filename as title for %s', episode.url) basename = os.path.basename(episode.url) episode.title, ext = os.path.splitext(basename) # Maemo bug 12073 if not episode.guid: logger.warn('Using download URL as GUID for %s', episode.title) episode.guid = episode.url seen_guids.add(episode.guid) else: continue # Detect (and update) existing episode based on GUIDs existing_episode = existing_guids.get(episode.guid, None) if existing_episode: existing_episode.update_from(episode) existing_episode.save() continue # Workaround for bug 340: If the episode has been # published earlier than one week before the most # recent existing episode, do not mark it as new. if episode.published < last_published - self.SECONDS_PER_WEEK: logger.debug('Episode with old date: %s', episode.title) episode.is_new = False if episode.is_new: new_episodes += 1 # Only allow a certain number of new episodes per update if (self.download_strategy == PodcastChannel.STRATEGY_LATEST and new_episodes > 1): episode.is_new = False episode.save() self.children.append(episode) self.remove_unreachable_episodes(existing, seen_guids, max_episodes) def remove_unreachable_episodes(self, existing, seen_guids, max_episodes): # Remove "unreachable" episodes - episodes that have not been # downloaded and that the feed does not list as downloadable anymore # Keep episodes that are currently being downloaded, though (bug 1534) if self.id is not None: episodes_to_purge = (e for e in existing if e.state != gpodder.STATE_DOWNLOADED and e.guid not in seen_guids and not e.downloading) for episode in episodes_to_purge: logger.debug('Episode removed from feed: %s (%s)', episode.title, episode.guid) gpodder.user_extensions.on_episode_removed_from_podcast(episode) self.db.delete_episode_by_guid(episode.guid, self.id) # Remove the episode from the "children" episodes list if self.children is not None: self.children.remove(episode) # This *might* cause episodes to be skipped if there were more than # max_episodes_per_feed items added to the feed between updates. # The benefit is that it prevents old episodes from apearing as new # in certain situations (see bug #340). self.db.purge(max_episodes, self.id) # TODO: Remove from self.children! # Sort episodes by pubdate, descending self.children.sort(key=lambda e: e.published, reverse=True) def update(self, max_episodes=0): try: result = self.feed_fetcher.fetch_channel(self) if result.status == feedcore.CUSTOM_FEED: self._consume_custom_feed(result.feed, max_episodes) elif result.status == feedcore.UPDATED_FEED: self._consume_updated_feed(result.feed, max_episodes) elif result.status == feedcore.NEW_LOCATION: url = result.feed.href logger.info('New feed location: %s => %s', self.url, url) if url in set(x.url for x in self.model.get_podcasts()): raise Exception('Already subscribed to ' + url) self.url = url self._consume_updated_feed(result.feed, max_episodes) elif result.status == feedcore.NOT_MODIFIED: pass if hasattr(result.feed, 'headers'): self.http_etag = result.feed.headers.get('etag', self.http_etag) self.http_last_modified = result.feed.headers.get('last-modified', self.http_last_modified) self.save() except Exception, e: # "Not really" errors #feedcore.AuthenticationRequired # Temporary errors #feedcore.Offline #feedcore.BadRequest #feedcore.InternalServerError #feedcore.WifiLogin # Permanent errors #feedcore.Unsubscribe #feedcore.NotFound #feedcore.InvalidFeed #feedcore.UnknownStatusCode gpodder.user_extensions.on_podcast_update_failed(self, e) raise gpodder.user_extensions.on_podcast_updated(self) # Re-determine the common prefix for all episodes self._determine_common_prefix() self.db.commit() def delete(self): self.db.delete_podcast(self) self.model._remove_podcast(self) def save(self): if self.download_folder is None: self.get_save_dir() gpodder.user_extensions.on_podcast_save(self) self.db.save_podcast(self) self.model._append_podcast(self) def get_statistics(self): if self.id is None: return (0, 0, 0, 0, 0) else: return self.db.get_podcast_statistics(self.id) @property def group_by(self): if not self.section: self.section = self._get_content_type() self.save() return self.section def _get_content_type(self): if 'youtube.com' in self.url or 'vimeo.com' in self.url: return _('Video') audio, video, other = 0, 0, 0 for content_type in self.db.get_content_types(self.id): content_type = content_type.lower() if content_type.startswith('audio'): audio += 1 elif content_type.startswith('video'): video += 1 else: other += 1 if audio >= video: return _('Audio') elif video > other: return _('Video') return _('Other') def authenticate_url(self, url): return util.url_add_authentication(url, self.auth_username, self.auth_password) def rename(self, new_title): new_title = new_title.strip() if self.title == new_title: return new_folder_name = self.find_unique_folder_name(new_title) if new_folder_name and new_folder_name != self.download_folder: new_folder = os.path.join(gpodder.downloads, new_folder_name) old_folder = os.path.join(gpodder.downloads, self.download_folder) if os.path.exists(old_folder): if not os.path.exists(new_folder): # Old folder exists, new folder does not -> simply rename logger.info('Renaming %s => %s', old_folder, new_folder) os.rename(old_folder, new_folder) else: # Both folders exist -> move files and delete old folder logger.info('Moving files from %s to %s', old_folder, new_folder) for file in glob.glob(os.path.join(old_folder, '*')): shutil.move(file, new_folder) logger.info('Removing %s', old_folder) shutil.rmtree(old_folder, ignore_errors=True) self.download_folder = new_folder_name self.title = new_title self.save() def _determine_common_prefix(self): # We need at least 2 episodes for the prefix to be "common" ;) if len(self.children) < 2: self._common_prefix = '' return prefix = os.path.commonprefix([x.title for x in self.children]) # The common prefix must end with a space - otherwise it's not # on a word boundary, and we might end up chopping off too much if prefix and prefix[-1] != ' ': prefix = prefix[:prefix.rfind(' ')+1] self._common_prefix = prefix def get_all_episodes(self): return self.children def get_episodes(self, state): return filter(lambda e: e.state == state, self.get_all_episodes()) def find_unique_folder_name(self, download_folder): # Remove trailing dots to avoid errors on Windows (bug 600) # Also remove leading dots to avoid hidden folders on Linux download_folder = download_folder.strip('.' + string.whitespace) for folder_name in util.generate_names(download_folder): if (not self.db.podcast_download_folder_exists(folder_name) or self.download_folder == folder_name): return folder_name def get_save_dir(self, force_new=False): if self.download_folder is None or force_new: # we must change the folder name, because it has not been set manually fn_template = util.sanitize_filename(self.title, self.MAX_FOLDERNAME_LENGTH) if not fn_template: fn_template = util.sanitize_filename(self.url, self.MAX_FOLDERNAME_LENGTH) # Find a unique folder name for this podcast download_folder = self.find_unique_folder_name(fn_template) # Try removing the download folder if it has been created previously if self.download_folder is not None: folder = os.path.join(gpodder.downloads, self.download_folder) try: os.rmdir(folder) except OSError: logger.info('Old download folder is kept for %s', self.url) logger.info('Updating download_folder of %s to %s', self.url, download_folder) self.download_folder = download_folder self.save() save_dir = os.path.join(gpodder.downloads, self.download_folder) # Avoid encoding errors for OS-specific functions (bug 1570) save_dir = util.sanitize_encoding(save_dir) # Create save_dir if it does not yet exist if not util.make_directory(save_dir): logger.error('Could not create save_dir: %s', save_dir) return save_dir save_dir = property(fget=get_save_dir) def remove_downloaded(self): # Remove the download directory for episode in self.get_episodes(gpodder.STATE_DOWNLOADED): filename = episode.local_filename(create=False, check_only=True) if filename is not None: gpodder.user_extensions.on_episode_delete(episode, filename) shutil.rmtree(self.save_dir, True) @property def cover_file(self): return os.path.join(self.save_dir, 'folder') class Model(object): PodcastClass = PodcastChannel def __init__(self, db): self.db = db self.children = None def _append_podcast(self, podcast): if podcast not in self.children: self.children.append(podcast) def _remove_podcast(self, podcast): self.children.remove(podcast) gpodder.user_extensions.on_podcast_delete(self) def get_podcasts(self): def podcast_factory(dct, db): return self.PodcastClass.create_from_dict(dct, self, dct['id']) if self.children is None: self.children = self.db.load_podcasts(podcast_factory) # Check download folders for changes (bug 902) for podcast in self.children: podcast.check_download_folder() return self.children def load_podcast(self, url, create=True, authentication_tokens=None, max_episodes=0): assert all(url != podcast.url for podcast in self.get_podcasts()) return self.PodcastClass.load(self, url, create, authentication_tokens, max_episodes) @classmethod def podcast_sort_key(cls, podcast): return cls.PodcastClass.sort_key(podcast) @classmethod def episode_sort_key(cls, episode): return episode.published @classmethod def sort_episodes_by_pubdate(cls, episodes, reverse=False): """Sort a list of PodcastEpisode objects chronologically Returns a iterable, sorted sequence of the episodes """ return sorted(episodes, key=cls.episode_sort_key, reverse=reverse) gpodder-3.5.2/src/gpodder/my.py0000644000175000017500000005702312220344566016002 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # my.py -- mygpo Client Abstraction for gPodder # Thomas Perl ; 2010-01-19 # import gpodder _ = gpodder.gettext import atexit import datetime import calendar import os import sys import time import logging logger = logging.getLogger(__name__) from gpodder import util from gpodder import minidb # Append gPodder's user agent to mygpoclient's user agent import mygpoclient mygpoclient.user_agent += ' ' + gpodder.user_agent # 2013-02-08: We should update this to 1.7 once we use the new features MYGPOCLIENT_REQUIRED = '1.4' if not hasattr(mygpoclient, 'require_version') or \ not mygpoclient.require_version(MYGPOCLIENT_REQUIRED): print >>sys.stderr, """ Please upgrade your mygpoclient library. See http://thp.io/2010/mygpoclient/ Required version: %s Installed version: %s """ % (MYGPOCLIENT_REQUIRED, mygpoclient.__version__) sys.exit(1) try: from mygpoclient.simple import MissingCredentials except ImportError: # if MissingCredentials does not yet exist in the installed version of # mygpoclient, we use an object that can never be raised/caught MissingCredentials = object() from mygpoclient import api from mygpoclient import public from mygpoclient import util as mygpoutil EXAMPLES_OPML = 'http://gpodder.org/directory.opml' TOPLIST_OPML = 'http://gpodder.org/toplist.opml' EPISODE_ACTIONS_BATCH_SIZE=100 # Database model classes class SinceValue(object): __slots__ = {'host': str, 'device_id': str, 'category': int, 'since': int} # Possible values for the "category" field PODCASTS, EPISODES = range(2) def __init__(self, host, device_id, category, since=0): self.host = host self.device_id = device_id self.category = category self.since = since class SubscribeAction(object): __slots__ = {'action_type': int, 'url': str} # Possible values for the "action_type" field ADD, REMOVE = range(2) def __init__(self, action_type, url): self.action_type = action_type self.url = url @property def is_add(self): return self.action_type == self.ADD @property def is_remove(self): return self.action_type == self.REMOVE @classmethod def add(cls, url): return cls(cls.ADD, url) @classmethod def remove(cls, url): return cls(cls.REMOVE, url) @classmethod def undo(cls, action): if action.is_add: return cls(cls.REMOVE, action.url) elif action.is_remove: return cls(cls.ADD, action.url) raise ValueError('Cannot undo action: %r' % action) # New entity name for "received" actions class ReceivedSubscribeAction(SubscribeAction): pass class UpdateDeviceAction(object): __slots__ = {'device_id': str, 'caption': str, 'device_type': str} def __init__(self, device_id, caption, device_type): self.device_id = device_id self.caption = caption self.device_type = device_type class EpisodeAction(object): __slots__ = {'podcast_url': str, 'episode_url': str, 'device_id': str, 'action': str, 'timestamp': int, 'started': int, 'position': int, 'total': int} def __init__(self, podcast_url, episode_url, device_id, \ action, timestamp, started, position, total): self.podcast_url = podcast_url self.episode_url = episode_url self.device_id = device_id self.action = action self.timestamp = timestamp self.started = started self.position = position self.total = total # New entity name for "received" actions class ReceivedEpisodeAction(EpisodeAction): pass class RewrittenUrl(object): __slots__ = {'old_url': str, 'new_url': str} def __init__(self, old_url, new_url): self.old_url = old_url self.new_url = new_url # End Database model classes # Helper class for displaying changes in the UI class Change(object): def __init__(self, action, podcast=None): self.action = action self.podcast = podcast @property def description(self): if self.action.is_add: return _('Add %s') % self.action.url else: return _('Remove %s') % self.podcast.title class MygPoClient(object): STORE_FILE = 'gpodder.net' FLUSH_TIMEOUT = 60 FLUSH_RETRIES = 3 def __init__(self, config): self._store = minidb.Store(os.path.join(gpodder.home, self.STORE_FILE)) self._config = config self._client = None # Initialize the _client attribute and register with config self.on_config_changed() assert self._client is not None self._config.add_observer(self.on_config_changed) self._worker_thread = None atexit.register(self._at_exit) def create_device(self): """Uploads the device changes to the server This should be called when device settings change or when the mygpo client functionality is enabled. """ # Remove all previous device update actions self._store.remove(self._store.load(UpdateDeviceAction)) # Insert our new update action action = UpdateDeviceAction(self.device_id, \ self._config.mygpo.device.caption, \ self._config.mygpo.device.type) self._store.save(action) def get_rewritten_urls(self): """Returns a list of rewritten URLs for uploads This should be called regularly. Every object returned should be merged into the database, and the old_url should be updated to new_url in every podcdast. """ rewritten_urls = self._store.load(RewrittenUrl) self._store.remove(rewritten_urls) return rewritten_urls def process_episode_actions(self, find_episode, on_updated=None): """Process received episode actions The parameter "find_episode" should be a function accepting two parameters (podcast_url and episode_url). It will be used to get an episode object that needs to be updated. It should return None if the requested episode does not exist. The optional callback "on_updated" should accept a single parameter (the episode object) and will be called whenever the episode data is changed in some way. """ logger.debug('Processing received episode actions...') for action in self._store.load(ReceivedEpisodeAction): if action.action not in ('play', 'delete'): # Ignore all other action types for now continue episode = find_episode(action.podcast_url, action.episode_url) if episode is None: # The episode does not exist on this client continue if action.action == 'play': logger.debug('Play action for %s', episode.url) episode.mark(is_played=True) if (action.timestamp > episode.current_position_updated and action.position is not None): logger.debug('Updating position for %s', episode.url) episode.current_position = action.position episode.current_position_updated = action.timestamp if action.total: logger.debug('Updating total time for %s', episode.url) episode.total_time = action.total episode.save() if on_updated is not None: on_updated(episode) elif action.action == 'delete': if not episode.was_downloaded(and_exists=True): # Set the episode to a "deleted" state logger.debug('Marking as deleted: %s', episode.url) episode.delete_from_disk() episode.save() if on_updated is not None: on_updated(episode) # Remove all received episode actions self._store.delete(ReceivedEpisodeAction) self._store.commit() logger.debug('Received episode actions processed.') def get_received_actions(self): """Returns a list of ReceivedSubscribeAction objects The list might be empty. All these actions have to be processed. The user should confirm which of these actions should be taken, the reest should be rejected. Use confirm_received_actions and reject_received_actions to return and finalize the actions received by this method in order to not receive duplicate actions. """ return self._store.load(ReceivedSubscribeAction) def confirm_received_actions(self, actions): """Confirm that a list of actions has been processed The UI should call this with a list of actions that have been accepted by the user and processed by the podcast backend. """ # Simply remove the received actions from the queue self._store.remove(actions) def reject_received_actions(self, actions): """Reject (undo) a list of ReceivedSubscribeAction objects The UI should call this with a list of actions that have been rejected by the user. A reversed set of actions will be uploaded to the server so that the state on the server matches the state on the client. """ # Create "undo" actions for received subscriptions self._store.save(SubscribeAction.undo(a) for a in actions) self.flush() # After we've handled the reverse-actions, clean up self._store.remove(actions) @property def host(self): return self._config.mygpo.server @property def device_id(self): return self._config.mygpo.device.uid def can_access_webservice(self): return self._config.mygpo.enabled and \ self._config.mygpo.username and \ self._config.mygpo.device.uid def set_subscriptions(self, urls): if self.can_access_webservice(): logger.debug('Uploading (overwriting) subscriptions...') self._client.put_subscriptions(self.device_id, urls) logger.debug('Subscription upload done.') else: raise Exception('Webservice access not enabled') def _convert_played_episode(self, episode, start, end, total): return EpisodeAction(episode.channel.url, \ episode.url, self.device_id, 'play', \ int(time.time()), start, end, total) def _convert_episode(self, episode, action): return EpisodeAction(episode.channel.url, \ episode.url, self.device_id, action, \ int(time.time()), None, None, None) def on_delete(self, episodes): logger.debug('Storing %d episode delete actions', len(episodes)) self._store.save(self._convert_episode(e, 'delete') for e in episodes) def on_download(self, episodes): logger.debug('Storing %d episode download actions', len(episodes)) self._store.save(self._convert_episode(e, 'download') for e in episodes) def on_playback_full(self, episode, start, end, total): logger.debug('Storing full episode playback action') self._store.save(self._convert_played_episode(episode, start, end, total)) def on_playback(self, episodes): logger.debug('Storing %d episode playback actions', len(episodes)) self._store.save(self._convert_episode(e, 'play') for e in episodes) def on_subscribe(self, urls): # Cancel previously-inserted "remove" actions self._store.remove(SubscribeAction.remove(url) for url in urls) # Insert new "add" actions self._store.save(SubscribeAction.add(url) for url in urls) self.flush() def on_unsubscribe(self, urls): # Cancel previously-inserted "add" actions self._store.remove(SubscribeAction.add(url) for url in urls) # Insert new "remove" actions self._store.save(SubscribeAction.remove(url) for url in urls) self.flush() def _at_exit(self): self._worker_proc(forced=True) self._store.commit() self._store.close() def _worker_proc(self, forced=False): if not forced: # Store the current contents of the queue database self._store.commit() logger.debug('Worker thread waiting for timeout') time.sleep(self.FLUSH_TIMEOUT) # Only work when enabled, UID set and allowed to work if self.can_access_webservice() and \ (self._worker_thread is not None or forced): self._worker_thread = None logger.debug('Worker thread starting to work...') for retry in range(self.FLUSH_RETRIES): must_retry = False if retry: logger.debug('Retrying flush queue...') # Update the device first, so it can be created if new for action in self._store.load(UpdateDeviceAction): if self.update_device(action): self._store.remove(action) else: must_retry = True # Upload podcast subscription actions actions = self._store.load(SubscribeAction) if self.synchronize_subscriptions(actions): self._store.remove(actions) else: must_retry = True # Upload episode actions actions = self._store.load(EpisodeAction) if self.synchronize_episodes(actions): self._store.remove(actions) else: must_retry = True if not must_retry or not self.can_access_webservice(): # No more pending actions, or no longer enabled. # Ready to quit. break logger.debug('Worker thread finished.') else: logger.info('Worker thread may not execute (disabled).') # Store the current contents of the queue database self._store.commit() def flush(self, now=False): if not self.can_access_webservice(): logger.warn('Flush requested, but sync disabled.') return if self._worker_thread is None or now: if now: logger.debug('Flushing NOW.') else: logger.debug('Flush requested.') self._worker_thread = util.run_in_background(lambda: self._worker_proc(now), True) else: logger.debug('Flush requested, already waiting.') def on_config_changed(self, name=None, old_value=None, new_value=None): if name in ('mygpo.username', 'mygpo.password', 'mygpo.server') \ or self._client is None: self._client = api.MygPodderClient(self._config.mygpo.username, self._config.mygpo.password, self._config.mygpo.server) logger.info('Reloading settings.') elif name.startswith('mygpo.device.'): # Update or create the device self.create_device() def synchronize_episodes(self, actions): logger.debug('Starting episode status sync.') def convert_to_api(action): dt = datetime.datetime.utcfromtimestamp(action.timestamp) action_ts = mygpoutil.datetime_to_iso8601(dt) return api.EpisodeAction(action.podcast_url, \ action.episode_url, action.action, \ action.device_id, action_ts, \ action.started, action.position, action.total) def convert_from_api(action): dt = mygpoutil.iso8601_to_datetime(action.timestamp) action_ts = calendar.timegm(dt.timetuple()) return ReceivedEpisodeAction(action.podcast, \ action.episode, action.device, \ action.action, action_ts, \ action.started, action.position, action.total) try: # Load the "since" value from the database since_o = self._store.get(SinceValue, host=self.host, \ device_id=self.device_id, \ category=SinceValue.EPISODES) # Use a default since object for the first-time case if since_o is None: since_o = SinceValue(self.host, self.device_id, SinceValue.EPISODES) # Step 1: Download Episode actions try: changes = self._client.download_episode_actions(since_o.since) received_actions = [convert_from_api(a) for a in changes.actions] logger.debug('Received %d episode actions', len(received_actions)) self._store.save(received_actions) # Save the "since" value for later use self._store.update(since_o, since=changes.since) except (MissingCredentials, mygpoclient.http.Unauthorized): # handle outside raise except Exception, e: logger.warn('Exception while polling for episodes.', exc_info=True) # Step 2: Upload Episode actions # Uploads are done in batches; uploading can resume if only parts # be uploaded; avoids empty uploads as well for lower in range(0, len(actions), EPISODE_ACTIONS_BATCH_SIZE): batch = actions[lower:lower+EPISODE_ACTIONS_BATCH_SIZE] # Convert actions to the mygpoclient format for uploading episode_actions = [convert_to_api(a) for a in batch] # Upload the episode actions self._client.upload_episode_actions(episode_actions) # Actions have been uploaded to the server - remove them self._store.remove(batch) logger.debug('Episode actions have been uploaded to the server.') return True except (MissingCredentials, mygpoclient.http.Unauthorized): logger.warn('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False except Exception, e: logger.error('Cannot upload episode actions: %s', str(e), exc_info=True) return False def synchronize_subscriptions(self, actions): logger.debug('Starting subscription sync.') try: # Load the "since" value from the database since_o = self._store.get(SinceValue, host=self.host, \ device_id=self.device_id, \ category=SinceValue.PODCASTS) # Use a default since object for the first-time case if since_o is None: since_o = SinceValue(self.host, self.device_id, SinceValue.PODCASTS) # Step 1: Pull updates from the server and notify the frontend result = self._client.pull_subscriptions(self.device_id, since_o.since) # Update the "since" value in the database self._store.update(since_o, since=result.since) # Store received actions for later retrieval (and in case we # have outdated actions in the database, simply remove them) for url in result.add: logger.debug('Received add action: %s', url) self._store.remove(ReceivedSubscribeAction.remove(url)) self._store.remove(ReceivedSubscribeAction.add(url)) self._store.save(ReceivedSubscribeAction.add(url)) for url in result.remove: logger.debug('Received remove action: %s', url) self._store.remove(ReceivedSubscribeAction.add(url)) self._store.remove(ReceivedSubscribeAction.remove(url)) self._store.save(ReceivedSubscribeAction.remove(url)) # Step 2: Push updates to the server and rewrite URLs (if any) actions = self._store.load(SubscribeAction) add = [a.url for a in actions if a.is_add] remove = [a.url for a in actions if a.is_remove] if add or remove: logger.debug('Uploading: +%d / -%d', len(add), len(remove)) # Only do a push request if something has changed result = self._client.update_subscriptions(self.device_id, add, remove) # Update the "since" value in the database self._store.update(since_o, since=result.since) # Store URL rewrites for later retrieval by GUI for old_url, new_url in result.update_urls: if new_url: logger.debug('Rewritten URL: %s', new_url) self._store.save(RewrittenUrl(old_url, new_url)) # Actions have been uploaded to the server - remove them self._store.remove(actions) logger.debug('All actions have been uploaded to the server.') return True except (MissingCredentials, mygpoclient.http.Unauthorized): logger.warn('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False except Exception, e: logger.error('Cannot upload subscriptions: %s', str(e), exc_info=True) return False def update_device(self, action): try: logger.debug('Uploading device settings...') self._client.update_device_settings(action.device_id, \ action.caption, action.device_type) logger.debug('Device settings uploaded.') return True except (MissingCredentials, mygpoclient.http.Unauthorized): logger.warn('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False return False except Exception, e: logger.error('Cannot update device %s: %s', self.device_id, str(e), exc_info=True) return False def get_devices(self): result = [] try: devices = self._client.get_devices() except (MissingCredentials, mygpoclient.http.Unauthorized): logger.warn('Invalid credentials. Disabling gpodder.net.') self._config.mygpo.enabled = False raise for d in devices: result.append((d.device_id, d.caption, d.type)) return result def open_website(self): util.open_website('http://' + self._config.mygpo.server) class Directory(object): def __init__(self): self.client = public.PublicClient() def toplist(self): return [(p.title or p.url, p.url) for p in self.client.get_toplist() if p.url] def search(self, query): return [(p.title or p.url, p.url) for p in self.client.search_podcasts(query) if p.url] gpodder-3.5.2/src/gpodder/opml.py0000644000175000017500000001573512220076757016334 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # opml.py -- OPML import and export functionality # Thomas Perl 2007-08-19 # # based on: libopmlreader.py (2006-06-13) # libopmlwriter.py (2005-12-08) # """OPML import and export functionality This module contains helper classes to import subscriptions from OPML files on the web and to export a list of channel objects to valid OPML 1.1 files that can be used to backup or distribute gPodder's channel subscriptions. """ import logging logger = logging.getLogger(__name__) from gpodder import util import xml.dom.minidom import os.path import os import shutil from email.utils import formatdate import gpodder class Importer(object): """ Helper class to import an OPML feed from protocols supported by urllib2 (e.g. HTTP) and return a GTK ListStore that can be displayed in the GUI. This class should support standard OPML feeds and contains workarounds to support odeo.com feeds. """ VALID_TYPES = ('rss', 'link') def __init__( self, url): """ Parses the OPML feed from the given URL into a local data structure containing channel metadata. """ self.items = [] try: if os.path.exists(url): doc = xml.dom.minidom.parse(url) else: doc = xml.dom.minidom.parseString(util.urlopen(url).read()) for outline in doc.getElementsByTagName('outline'): # Make sure we are dealing with a valid link type (ignore case) otl_type = outline.getAttribute('type') if otl_type is None or otl_type.lower() not in self.VALID_TYPES: continue if outline.getAttribute('xmlUrl') or outline.getAttribute('url'): channel = { 'url': outline.getAttribute('xmlUrl') or outline.getAttribute('url'), 'title': outline.getAttribute('title') or outline.getAttribute('text') or outline.getAttribute('xmlUrl') or outline.getAttribute('url'), 'description': outline.getAttribute('text') or outline.getAttribute('xmlUrl') or outline.getAttribute('url'), } if channel['description'] == channel['title']: channel['description'] = channel['url'] for attr in ( 'url', 'title', 'description' ): channel[attr] = channel[attr].strip() self.items.append( channel) if not len(self.items): logger.info('OPML import finished, but no items found: %s', url) except: logger.error('Cannot import OPML from URL: %s', url, exc_info=True) class Exporter(object): """ Helper class to export a list of channel objects to a local file in OPML 1.1 format. See www.opml.org for the OPML specification. """ FEED_TYPE = 'rss' def __init__( self, filename): if filename is None: self.filename = None elif filename.endswith( '.opml') or filename.endswith( '.xml'): self.filename = filename else: self.filename = '%s.opml' % ( filename, ) def create_node( self, doc, name, content): """ Creates a simple XML Element node in a document with tag name "name" and text content "content", as in content and returns the element. """ node = doc.createElement( name) node.appendChild( doc.createTextNode( content)) return node def create_outline( self, doc, channel): """ Creates a OPML outline as XML Element node in a document for the supplied channel. """ outline = doc.createElement( 'outline') outline.setAttribute( 'title', channel.title) outline.setAttribute( 'text', channel.description) outline.setAttribute( 'xmlUrl', channel.url) outline.setAttribute( 'type', self.FEED_TYPE) return outline def write( self, channels): """ Creates a XML document containing metadata for each channel object in the "channels" parameter, which should be a list of channel objects. OPML 2.0 specification: http://www.opml.org/spec2 Returns True on success or False when there was an error writing the file. """ if self.filename is None: return False doc = xml.dom.minidom.Document() opml = doc.createElement('opml') opml.setAttribute('version', '2.0') doc.appendChild(opml) head = doc.createElement( 'head') head.appendChild( self.create_node( doc, 'title', 'gPodder subscriptions')) head.appendChild( self.create_node( doc, 'dateCreated', formatdate(localtime=True))) opml.appendChild( head) body = doc.createElement( 'body') for channel in channels: body.appendChild( self.create_outline( doc, channel)) opml.appendChild( body) try: data = doc.toprettyxml(encoding='utf-8', indent=' ', newl=os.linesep) # We want to have at least 512 KiB free disk space after # saving the opml data, if this is not possible, don't # try to save the new file, but keep the old one so we # don't end up with a clobbed, empty opml file. FREE_DISK_SPACE_AFTER = 1024*512 path = os.path.dirname(self.filename) or os.path.curdir available = util.get_free_disk_space(path) if available < 2*len(data)+FREE_DISK_SPACE_AFTER: # On Windows, if we have zero bytes available, assume that we have # not had the win32file module available + assume enough free space if not gpodder.ui.win32 or available > 0: logger.error('Not enough free disk space to save channel list to %s', self.filename) return False fp = open(self.filename+'.tmp', 'w') fp.write(data) fp.close() util.atomic_rename(self.filename+'.tmp', self.filename) except: logger.error('Could not open file for writing: %s', self.filename, exc_info=True) return False return True gpodder-3.5.2/src/gpodder/player.py0000644000175000017500000000450412220076757016651 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.player - Podcatcher implementation of the Media Player D-Bus API # Thomas Perl ; 2010-04-25 # # Specification: http://gpodder.org/wiki/Media_Player_D-Bus_API # import gpodder import urllib class MediaPlayerDBusReceiver(object): INTERFACE = 'org.gpodder.player' SIGNAL_STARTED = 'PlaybackStarted' SIGNAL_STOPPED = 'PlaybackStopped' def __init__(self, on_play_event): self.on_play_event = on_play_event self.bus = gpodder.dbus_session_bus self.bus.add_signal_receiver(self.on_playback_started, \ self.SIGNAL_STARTED, \ self.INTERFACE, \ None, \ None) self.bus.add_signal_receiver(self.on_playback_stopped, \ self.SIGNAL_STOPPED, \ self.INTERFACE, \ None, \ None) def on_playback_started(self, position, file_uri): pass def on_playback_stopped(self, start, end, total, file_uri): # Assume the URI comes as quoted UTF-8 string, so decode # it first to utf-8 (should be no problem) for unquoting # to work correctly on this later on (Maemo bug 11811) if isinstance(file_uri, unicode): file_uri = file_uri.encode('utf-8') if file_uri.startswith('/'): file_uri = 'file://' + urllib.quote(file_uri) self.on_play_event(start, end, total, file_uri) gpodder-3.5.2/src/gpodder/query.py0000644000175000017500000001213412220076757016520 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.query - Episode Query Language (EQL) implementation (2010-11-29) # import gpodder import re import datetime class Matcher(object): """Match implementation for EQL This class implements the low-level matching of EQL statements against episode objects. """ def __init__(self, episode): self._episode = episode def match(self, term): try: return bool(eval(term, {'__builtins__': None}, self)) except Exception, e: print e return False def __getitem__(self, k): episode = self._episode # Adjectives (for direct usage) if k == 'new': return (episode.state == gpodder.STATE_NORMAL and episode.is_new) elif k in ('downloaded', 'dl'): return episode.was_downloaded(and_exists=True) elif k in ('deleted', 'rm'): return episode.state == gpodder.STATE_DELETED elif k == 'played': return not episode.is_new elif k == 'downloading': return episode.downloading elif k == 'archive': return episode.archive elif k in ('finished', 'fin'): return episode.is_finished() elif k in ('video', 'audio'): return episode.file_type() == k elif k == 'torrent': return episode.url.endswith('.torrent') or 'torrent' in episode.mime_type # Nouns (for comparisons) if k in ('megabytes', 'mb'): return float(episode.file_size) / (1024*1024) elif k == 'title': return episode.title elif k == 'description': return episode.description elif k == 'since': return (datetime.datetime.now() - datetime.datetime.fromtimestamp(episode.published)).days elif k == 'age': return episode.age_in_days() elif k in ('minutes', 'min'): return float(episode.total_time) / 60 elif k in ('remaining', 'rem'): return float(episode.total_time - episode.current_position) / 60 raise KeyError(k) class EQL(object): """A Query in EQL Objects of this class represent a query on episodes using EQL. Example usage: >>> q = EQL('downloaded and megabytes > 10') >>> q.filter(channel.get_all_episodes()) >>> EQL('new and video').match(episode) Regular expression queries are also supported: >>> q = EQL('/^The.*/') >>> q = EQL('/community/i') Normal string matches are also supported: >>> q = EQL('"S04"') >>> q = EQL("'linux'") Normal EQL queries cannot be mixed with RegEx or string matching yet, so this does NOT work: >>> EQL('downloaded and /The.*/i') """ def __init__(self, query): self._query = query self._flags = 0 self._regex = False self._string = False # Regular expression based query match = re.match(r'^/(.*)/(i?)$', query) if match is not None: self._regex = True self._query, flags = match.groups() if flags == 'i': self._flags |= re.I # String based query match = re.match("^([\"'])(.*)(\\1)$", query) if match is not None: self._string = True a, query, b = match.groups() self._query = query.lower() # For everything else, compile the expression if not self._regex and not self._string: try: self._query = compile(query, '', 'eval') except Exception, e: print e self._query = None def match(self, episode): if self._query is None: return False if self._regex: return re.search(self._query, episode.title, self._flags) is not None elif self._string: return self._query in episode.title.lower() return Matcher(episode).match(self._query) def filter(self, episodes): return filter(self.match, episodes) def UserEQL(query): """EQL wrapper for user input Automatically adds missing quotes around a non-EQL string for user-based input. In this case, EQL queries need to be enclosed in (). """ if query is None: return None if query == '' or (query and query[0] not in "(/'\""): return EQL("'%s'" % query) else: return EQL(query) gpodder-3.5.2/src/gpodder/schema.py0000644000175000017500000002233512220076757016617 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.schema - Database schema update and migration facility # Thomas Perl ; 2011-02-01 from sqlite3 import dbapi2 as sqlite import time import shutil import logging logger = logging.getLogger(__name__) EpisodeColumns = ( 'podcast_id', 'title', 'description', 'url', 'published', 'guid', 'link', 'file_size', 'mime_type', 'state', 'is_new', 'archive', 'download_filename', 'total_time', 'current_position', 'current_position_updated', 'last_playback', 'payment_url', ) PodcastColumns = ( 'title', 'url', 'link', 'description', 'cover_url', 'auth_username', 'auth_password', 'http_last_modified', 'http_etag', 'auto_archive_episodes', 'download_folder', 'pause_subscription', 'section', 'payment_url', 'download_strategy', 'sync_to_mp3_player', ) CURRENT_VERSION = 5 # SQL commands to upgrade old database versions to new ones # Each item is a tuple (old_version, new_version, sql_commands) that should be # applied to the database to migrate from old_version to new_version. UPGRADE_SQL = [ # Version 2: Section labels for the podcast list (1, 2, """ ALTER TABLE podcast ADD COLUMN section TEXT NOT NULL DEFAULT '' """), # Version 3: Flattr integration (+ invalidate http_* fields to force # a feed update, so that payment URLs are parsed during the next check) (2, 3, """ ALTER TABLE podcast ADD COLUMN payment_url TEXT NULL DEFAULT NULL ALTER TABLE episode ADD COLUMN payment_url TEXT NULL DEFAULT NULL UPDATE podcast SET http_last_modified=NULL, http_etag=NULL """), # Version 4: Per-podcast download strategy management (3, 4, """ ALTER TABLE podcast ADD COLUMN download_strategy INTEGER NOT NULL DEFAULT 0 """), # Version 5: Per-podcast MP3 player device synchronization option (4, 5, """ ALTER TABLE podcast ADD COLUMN sync_to_mp3_player INTEGER NOT NULL DEFAULT 1 """) ] def initialize_database(db): # Create table for podcasts db.execute(""" CREATE TABLE podcast ( id INTEGER PRIMARY KEY NOT NULL, title TEXT NOT NULL DEFAULT '', url TEXT NOT NULL DEFAULT '', link TEXT NOT NULL DEFAULT '', description TEXT NOT NULL DEFAULT '', cover_url TEXT NULL DEFAULT NULL, auth_username TEXT NULL DEFAULT NULL, auth_password TEXT NULL DEFAULT NULL, http_last_modified TEXT NULL DEFAULT NULL, http_etag TEXT NULL DEFAULT NULL, auto_archive_episodes INTEGER NOT NULL DEFAULT 0, download_folder TEXT NOT NULL DEFAULT '', pause_subscription INTEGER NOT NULL DEFAULT 0, section TEXT NOT NULL DEFAULT '', payment_url TEXT NULL DEFAULT NULL, download_strategy INTEGER NOT NULL DEFAULT 0, sync_to_mp3_player INTEGER NOT NULL DEFAULT 1 ) """) INDEX_SQL = """ CREATE UNIQUE INDEX idx_podcast_url ON podcast (url) CREATE UNIQUE INDEX idx_podcast_download_folder ON podcast (download_folder) """ for sql in INDEX_SQL.strip().split('\n'): db.execute(sql) # Create table for episodes db.execute(""" CREATE TABLE episode ( id INTEGER PRIMARY KEY NOT NULL, podcast_id INTEGER NOT NULL, title TEXT NOT NULL DEFAULT '', description TEXT NOT NULL DEFAULT '', url TEXT NOT NULL, published INTEGER NOT NULL DEFAULT 0, guid TEXT NOT NULL, link TEXT NOT NULL DEFAULT '', file_size INTEGER NOT NULL DEFAULT 0, mime_type TEXT NOT NULL DEFAULT 'application/octet-stream', state INTEGER NOT NULL DEFAULT 0, is_new INTEGER NOT NULL DEFAULT 0, archive INTEGER NOT NULL DEFAULT 0, download_filename TEXT NULL DEFAULT NULL, total_time INTEGER NOT NULL DEFAULT 0, current_position INTEGER NOT NULL DEFAULT 0, current_position_updated INTEGER NOT NULL DEFAULT 0, last_playback INTEGER NOT NULL DEFAULT 0, payment_url TEXT NULL DEFAULT NULL ) """) INDEX_SQL = """ CREATE INDEX idx_episode_podcast_id ON episode (podcast_id) CREATE UNIQUE INDEX idx_episode_download_filename ON episode (podcast_id, download_filename) CREATE UNIQUE INDEX idx_episode_guid ON episode (podcast_id, guid) CREATE INDEX idx_episode_state ON episode (state) CREATE INDEX idx_episode_is_new ON episode (is_new) CREATE INDEX idx_episode_archive ON episode (archive) CREATE INDEX idx_episode_published ON episode (published) """ for sql in INDEX_SQL.strip().split('\n'): db.execute(sql) # Create table for version info / metadata + insert initial data db.execute("""CREATE TABLE version (version integer)""") db.execute("INSERT INTO version (version) VALUES (%d)" % CURRENT_VERSION) db.commit() def upgrade(db, filename): if not list(db.execute('PRAGMA table_info(version)')): initialize_database(db) return version = db.execute('SELECT version FROM version').fetchone()[0] if version == CURRENT_VERSION: return # We are trying an upgrade - save the current version of the DB backup = '%s_upgraded-v%d_%d' % (filename, int(version), int(time.time())) try: shutil.copy(filename, backup) except Exception, e: raise Exception('Cannot create DB backup before upgrade: ' + e) db.execute("DELETE FROM version") for old_version, new_version, upgrade in UPGRADE_SQL: if version == old_version: for sql in upgrade.strip().split('\n'): db.execute(sql) version = new_version assert version == CURRENT_VERSION db.execute("INSERT INTO version (version) VALUES (%d)" % version) db.commit() if version != CURRENT_VERSION: raise Exception('Database schema version unknown') def convert_gpodder2_db(old_db, new_db): """Convert gPodder 2.x databases to the new format Both arguments should be SQLite3 connections to the corresponding databases. """ old_db = sqlite.connect(old_db) new_db_filename = new_db new_db = sqlite.connect(new_db) upgrade(new_db, new_db_filename) # Copy data for podcasts old_cur = old_db.cursor() columns = [x[1] for x in old_cur.execute('PRAGMA table_info(channels)')] for row in old_cur.execute('SELECT * FROM channels'): row = dict(zip(columns, row)) values = ( row['id'], row['override_title'] or row['title'], row['url'], row['link'], row['description'], row['image'], row['username'] or None, row['password'] or None, row['last_modified'] or None, row['etag'] or None, row['channel_is_locked'], row['foldername'], not row['feed_update_enabled'], '', None, 0, row['sync_to_devices'], ) new_db.execute(""" INSERT INTO podcast VALUES (%s) """ % ', '.join('?'*len(values)), values) old_cur.close() # Copy data for episodes old_cur = old_db.cursor() columns = [x[1] for x in old_cur.execute('PRAGMA table_info(episodes)')] for row in old_cur.execute('SELECT * FROM episodes'): row = dict(zip(columns, row)) values = ( row['id'], row['channel_id'], row['title'], row['description'], row['url'], row['pubDate'], row['guid'], row['link'], row['length'], row['mimetype'], row['state'], not row['played'], row['locked'], row['filename'], row['total_time'], row['current_position'], row['current_position_updated'], 0, None, ) new_db.execute(""" INSERT INTO episode VALUES (%s) """ % ', '.join('?'*len(values)), values) old_cur.close() old_db.close() new_db.commit() new_db.close() def check_data(db): # All episodes must be assigned to a podcast orphan_episodes = db.get('SELECT COUNT(id) FROM episode ' 'WHERE podcast_id NOT IN (SELECT id FROM podcast)') if orphan_episodes > 0: logger.error('Orphaned episodes found in database') gpodder-3.5.2/src/gpodder/services.py0000644000175000017500000000350412220076757017177 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # services.py -- Core Services for gPodder # Thomas Perl 2007-08-24 # # import gpodder _ = gpodder.gettext from gpodder import util class ObservableService(object): def __init__(self, signal_names=[]): self.observers = {} for signal in signal_names: self.observers[signal] = [] def register(self, signal_name, observer): if signal_name in self.observers: if not observer in self.observers[signal_name]: self.observers[signal_name].append(observer) return True return False def unregister(self, signal_name, observer): if signal_name in self.observers: if observer in self.observers[signal_name]: self.observers[signal_name].remove(observer) return True return False def notify(self, signal_name, *args): if signal_name in self.observers: for observer in self.observers[signal_name]: util.idle_add(observer, *args) return True return False gpodder-3.5.2/src/gpodder/sync.py0000644000175000017500000011226412220076757016334 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # sync.py -- Device synchronization # Thomas Perl 2007-12-06 # based on libipodsync.py (2006-04-05 Thomas Perl) # Ported to gPodder 3 by Joseph Wickremasinghe in June 2012 import gpodder from gpodder import util from gpodder import services from gpodder import download import logging logger = logging.getLogger(__name__) import calendar _ = gpodder.gettext # # TODO: Re-enable iPod and MTP sync support # pymtp_available = False gpod_available = False #gpod_available = True #try: # import gpod #except: # gpod_available = False # logger.warning('Could not find gpod') # #pymtp_available = True #try: # import gpodder.gpopymtp as pymtp #except: # pymtp_available = False # logger.warning('Could not load gpopymtp (libmtp not installed?).') try: import eyeD3 except: logger.warning('Could not find eyeD3') import os.path import glob import time if pymtp_available: class MTP(pymtp.MTP): sep = os.path.sep def __init__(self): pymtp.MTP.__init__(self) self.folders = {} def connect(self): pymtp.MTP.connect(self) self.folders = self.unfold(self.mtp.LIBMTP_Get_Folder_List(self.device)) def get_folder_list(self): return self.folders def unfold(self, folder, path=''): result = {} while folder: folder = folder.contents name = self.sep.join([path, folder.name]).lstrip(self.sep) result[name] = folder.folder_id if folder.child: result.update(self.unfold(folder.child, name)) folder = folder.sibling return result def mkdir(self, path): folder_id = 0 prefix = [] parts = path.split(self.sep) while parts: prefix.append(parts[0]) tmpath = self.sep.join(prefix) if self.folders.has_key(tmpath): folder_id = self.folders[tmpath] else: folder_id = self.create_folder(parts[0], parent=folder_id) # logger.info('Creating subfolder %s in %s (id=%u)' % (parts[0], self.sep.join(prefix), folder_id)) tmpath = self.sep.join(prefix + [parts[0]]) self.folders[tmpath] = folder_id # logger.info(">>> %s = %s" % (tmpath, folder_id)) del parts[0] # logger.info('MTP.mkdir: %s = %u' % (path, folder_id)) return folder_id def open_device(gui): config = gui._config device_type = gui._config.device_sync.device_type if device_type == 'filesystem': return MP3PlayerDevice(config, gui.download_status_model, gui.download_queue_manager) return None def get_track_length(filename): if util.find_command('mplayer') is not None: try: mplayer_output = os.popen('mplayer -msglevel all=-1 -identify -vo null -ao null -frames 0 "%s" 2>/dev/null' % filename).read() return int(float(mplayer_output[mplayer_output.index('ID_LENGTH'):].splitlines()[0][10:])*1000) except: pass else: logger.info('Please install MPlayer for track length detection.') try: eyed3_info = eyeD3.Mp3AudioFile(filename) return int(eyed3_info.getPlayTime()*1000) except: pass return int(60*60*1000*3) # Default is three hours (to be on the safe side) class SyncTrack(object): """ This represents a track that is on a device. You need to specify at least the following keyword arguments, because these will be used to display the track in the GUI. All other keyword arguments are optional and can be used to reference internal objects, etc... See the iPod synchronization code for examples. Keyword arguments needed: playcount (How often has the track been played?) podcast (Which podcast is this track from? Or: Folder name) released (The release date of the episode) If any of these fields is unknown, it should not be passed to the function (the values will default to None for all required fields). """ def __init__(self, title, length, modified, **kwargs): self.title = title self.length = length self.filesize = util.format_filesize(length) self.modified = modified # Set some (possible) keyword arguments to default values self.playcount = 0 self.podcast = None self.released = None # Convert keyword arguments to object attributes self.__dict__.update(kwargs) @property def playcount_str(self): return str(self.playcount) class Device(services.ObservableService): def __init__(self, config): self._config = config self.cancelled = False self.allowed_types = ['audio', 'video'] self.errors = [] self.tracks_list = [] signals = ['progress', 'sub-progress', 'status', 'done', 'post-done'] services.ObservableService.__init__(self, signals) def open(self): pass def cancel(self): self.cancelled = True self.notify('status', _('Cancelled by user')) def close(self): self.notify('status', _('Writing data to disk')) if self._config.device_sync.after_sync.sync_disks and not gpodder.ui.win32: os.system('sync') else: logger.warning('Not syncing disks. Unmount your device before unplugging.') return True def add_sync_tasks(self,tracklist, force_played=False, done_callback=None): for track in list(tracklist): # Filter tracks that are not meant to be synchronized does_not_exist = not track.was_downloaded(and_exists=True) exclude_played = (not track.is_new and self._config.device_sync.skip_played_episodes) wrong_type = track.file_type() not in self.allowed_types if does_not_exist or exclude_played or wrong_type: logger.info('Excluding %s from sync', track.title) tracklist.remove(track) if tracklist: for track in sorted(tracklist, key=lambda e: e.pubdate_prop): if self.cancelled: return False # XXX: need to check if track is added properly? sync_task=SyncTask(track) sync_task.status=sync_task.QUEUED sync_task.device=self self.download_status_model.register_task(sync_task) self.download_queue_manager.add_task(sync_task) else: logger.warning("No episodes to sync") if done_callback: done_callback() return True def remove_tracks(self, tracklist): for idx, track in enumerate(tracklist): if self.cancelled: return False self.notify('progress', idx, len(tracklist)) self.remove_track(track) return True def get_all_tracks(self): pass def add_track(self, track, reporthook=None): pass def remove_track(self, track): pass def get_free_space(self): pass def episode_on_device(self, episode): return self._track_on_device(episode.title) def _track_on_device(self, track_name): for t in self.tracks_list: title = t.title if track_name == title: return t return None class iPodDevice(Device): def __init__(self, config): Device.__init__(self, config) self.mountpoint = str(self._config.ipod_mount) self.itdb = None self.podcast_playlist = None def get_free_space(self): # Reserve 10 MiB for iTunesDB writing (to be on the safe side) RESERVED_FOR_ITDB = 1024*1024*10 return util.get_free_disk_space(self.mountpoint) - RESERVED_FOR_ITDB def open(self): Device.open(self) if not gpod_available or not os.path.isdir(self.mountpoint): return False self.notify('status', _('Opening iPod database')) self.itdb = gpod.itdb_parse(self.mountpoint, None) if self.itdb is None: return False self.itdb.mountpoint = self.mountpoint self.podcasts_playlist = gpod.itdb_playlist_podcasts(self.itdb) self.master_playlist = gpod.itdb_playlist_mpl(self.itdb) if self.podcasts_playlist: self.notify('status', _('iPod opened')) # build the initial tracks_list self.tracks_list = self.get_all_tracks() return True else: return False def close(self): if self.itdb is not None: self.notify('status', _('Saving iPod database')) gpod.itdb_write(self.itdb, None) self.itdb = None if self._config.ipod_write_gtkpod_extended: self.notify('status', _('Writing extended gtkpod database')) itunes_folder = os.path.join(self.mountpoint, 'iPod_Control', 'iTunes') ext_filename = os.path.join(itunes_folder, 'iTunesDB.ext') idb_filename = os.path.join(itunes_folder, 'iTunesDB') if os.path.exists(ext_filename) and os.path.exists(idb_filename): try: db = gpod.ipod.Database(self.mountpoint) gpod.gtkpod.parse(ext_filename, db, idb_filename) gpod.gtkpod.write(ext_filename, db, idb_filename) db.close() except: logger.error('Error writing iTunesDB.ext') else: logger.warning('Could not find %s or %s.', ext_filename, idb_filename) Device.close(self) return True def update_played_or_delete(self, channel, episodes, delete_from_db): """ Check whether episodes on ipod are played and update as played and delete if required. """ for episode in episodes: track = self.episode_on_device(episode) if track: gtrack = track.libgpodtrack if gtrack.playcount > 0: if delete_from_db and not gtrack.rating: logger.info('Deleting episode from db %s', gtrack.title) channel.delete_episode(episode) else: logger.info('Marking episode as played %s', gtrack.title) def purge(self): for track in gpod.sw_get_playlist_tracks(self.podcasts_playlist): if gpod.itdb_filename_on_ipod(track) is None: logger.info('Episode has no file: %s', track.title) # self.remove_track_gpod(track) elif track.playcount > 0 and not track.rating: logger.info('Purging episode: %s', track.title) self.remove_track_gpod(track) def get_all_tracks(self): tracks = [] for track in gpod.sw_get_playlist_tracks(self.podcasts_playlist): filename = gpod.itdb_filename_on_ipod(track) if filename is None: # This can happen if the episode is deleted on the device logger.info('Episode has no file: %s', track.title) self.remove_track_gpod(track) continue length = util.calculate_size(filename) timestamp = util.file_modification_timestamp(filename) modified = util.format_date(timestamp) try: released = gpod.itdb_time_mac_to_host(track.time_released) released = util.format_date(released) except ValueError, ve: # timestamp out of range for platform time_t (bug 418) logger.info('Cannot convert track time: %s', ve) released = 0 t = SyncTrack(track.title, length, modified, modified_sort=timestamp, libgpodtrack=track, playcount=track.playcount, released=released, podcast=track.artist) tracks.append(t) return tracks def remove_track(self, track): self.notify('status', _('Removing %s') % track.title) self.remove_track_gpod(track.libgpodtrack) def remove_track_gpod(self, track): filename = gpod.itdb_filename_on_ipod(track) try: gpod.itdb_playlist_remove_track(self.podcasts_playlist, track) except: logger.info('Track %s not in playlist', track.title) gpod.itdb_track_unlink(track) util.delete_file(filename) def add_track(self, episode): self.notify('status', _('Adding %s') % episode.title) for track in gpod.sw_get_playlist_tracks(self.podcasts_playlist): if episode.url == track.podcasturl: # Mark as played on iPod if played locally (and set podcast flags) self.set_podcast_flags(track, episode) return True original_filename = episode.local_filename(create=False) # The file has to exist, if we ought to transfer it, and therefore, # local_filename(create=False) must never return None as filename assert original_filename is not None local_filename = original_filename if util.calculate_size(original_filename) > self.get_free_space(): logger.error('Not enough space on %s, sync aborted...', self.mountpoint) d = {'episode': episode.title, 'mountpoint': self.mountpoint} message =_('Error copying %(episode)s: Not enough free space on %(mountpoint)s') self.errors.append(message % d) self.cancelled = True return False local_filename = self.convert_track(episode) (fn, extension) = os.path.splitext(local_filename) if extension.lower().endswith('ogg'): logger.error('Cannot copy .ogg files to iPod.') return False track = gpod.itdb_track_new() # Add release time to track if pubdate has a valid value if episode.pubdate > 0: try: # libgpod>= 0.5.x uses a new timestamp format track.time_released = gpod.itdb_time_host_to_mac(int(episode.pubdate)) except: # old (pre-0.5.x) libgpod versions expect mactime, so # we're going to manually build a good mactime timestamp here :) # # + 2082844800 for unixtime => mactime (1970 => 1904) track.time_released = int(episode.pubdate + 2082844800) track.title = str(episode.title) track.album = str(episode.channel.title) track.artist = str(episode.channel.title) track.description = str(util.remove_html_tags(episode.description)) track.podcasturl = str(episode.url) track.podcastrss = str(episode.channel.url) track.tracklen = get_track_length(local_filename) track.size = os.path.getsize(local_filename) if episode.file_type() == 'audio': track.filetype = 'mp3' track.mediatype = 0x00000004 elif episode.file_type() == 'video': track.filetype = 'm4v' track.mediatype = 0x00000006 self.set_podcast_flags(track, episode) gpod.itdb_track_add(self.itdb, track, -1) gpod.itdb_playlist_add_track(self.master_playlist, track, -1) gpod.itdb_playlist_add_track(self.podcasts_playlist, track, -1) copied = gpod.itdb_cp_track_to_ipod(track, str(local_filename), None) if copied and gpodder.user_hooks is not None: gpodder.user_hooks.on_file_copied_to_ipod(self, local_filename) # If the file has been converted, delete the temporary file here if local_filename != original_filename: util.delete_file(local_filename) return True def set_podcast_flags(self, track, episode): try: # Set several flags for to podcast values track.remember_playback_position = 0x01 track.flag1 = 0x02 track.flag2 = 0x01 track.flag3 = 0x01 track.flag4 = 0x01 except: logger.warning('Seems like your python-gpod is out-of-date.') class MP3PlayerDevice(Device): def __init__(self, config, download_status_model, download_queue_manager): Device.__init__(self, config) self.destination = util.sanitize_encoding(self._config.device_sync.device_folder) self.buffer_size = 1024*1024 # 1 MiB self.download_status_model = download_status_model self.download_queue_manager = download_queue_manager def get_free_space(self): return util.get_free_disk_space(self.destination) def open(self): Device.open(self) self.notify('status', _('Opening MP3 player')) if util.directory_is_writable(self.destination): self.notify('status', _('MP3 player opened')) self.tracks_list = self.get_all_tracks() return True return False def add_track(self, episode,reporthook=None): self.notify('status', _('Adding %s') % episode.title.decode('utf-8', 'ignore')) if self._config.device_sync.one_folder_per_podcast: # Add channel title as subfolder folder = episode.channel.title # Clean up the folder name for use on limited devices folder = util.sanitize_filename(folder, self._config.device_sync.max_filename_length) folder = os.path.join(self.destination, folder) else: folder = self.destination folder = util.sanitize_encoding(folder) filename = episode.local_filename(create=False) # The file has to exist, if we ought to transfer it, and therefore, # local_filename(create=False) must never return None as filename assert filename is not None from_file = util.sanitize_encoding(filename) filename_base = util.sanitize_filename(episode.sync_filename( self._config.device_sync.custom_sync_name_enabled, self._config.device_sync.custom_sync_name), self._config.device_sync.max_filename_length) to_file = filename_base + os.path.splitext(from_file)[1].lower() # dirty workaround: on bad (empty) episode titles, # we simply use the from_file basename # (please, podcast authors, FIX YOUR RSS FEEDS!) if os.path.splitext(to_file)[0] == '': to_file = os.path.basename(from_file) to_file = util.sanitize_encoding(os.path.join(folder, to_file)) if not os.path.exists(folder): try: os.makedirs(folder) except: logger.error('Cannot create folder on MP3 player: %s', folder) return False if not os.path.exists(to_file): logger.info('Copying %s => %s', os.path.basename(from_file), to_file.decode(util.encoding)) self.copy_file_progress(from_file, to_file, reporthook) return True def copy_file_progress(self, from_file, to_file, reporthook=None): try: out_file = open(to_file, 'wb') except IOError, ioerror: d = {'filename': ioerror.filename, 'message': ioerror.strerror} self.errors.append(_('Error opening %(filename)s: %(message)s') % d) self.cancel() return False try: in_file = open(from_file, 'rb') except IOError, ioerror: d = {'filename': ioerror.filename, 'message': ioerror.strerror} self.errors.append(_('Error opening %(filename)s: %(message)s') % d) self.cancel() return False in_file.seek(0, os.SEEK_END) total_bytes = in_file.tell() in_file.seek(0) bytes_read = 0 s = in_file.read(self.buffer_size) while s: bytes_read += len(s) try: out_file.write(s) except IOError, ioerror: self.errors.append(ioerror.strerror) try: out_file.close() except: pass try: logger.info('Trying to remove partially copied file: %s' % to_file) os.unlink( to_file) logger.info('Yeah! Unlinked %s at least..' % to_file) except: logger.error('Error while trying to unlink %s. OH MY!' % to_file) self.cancel() return False reporthook(bytes_read, 1, total_bytes) s = in_file.read(self.buffer_size) out_file.close() in_file.close() return True def get_all_tracks(self): tracks = [] if self._config.one_folder_per_podcast: files = glob.glob(os.path.join(self.destination, '*', '*')) else: files = glob.glob(os.path.join(self.destination, '*')) for filename in files: (title, extension) = os.path.splitext(os.path.basename(filename)) length = util.calculate_size(filename) timestamp = util.file_modification_timestamp(filename) modified = util.format_date(timestamp) if self._config.one_folder_per_podcast: podcast_name = os.path.basename(os.path.dirname(filename)) else: podcast_name = None t = SyncTrack(title, length, modified, modified_sort=timestamp, filename=filename, podcast=podcast_name) tracks.append(t) return tracks def episode_on_device(self, episode): e = util.sanitize_filename(episode.sync_filename( self._config.device_sync.custom_sync_name_enabled, self._config.device_sync.custom_sync_name), self._config.device_sync.max_filename_length) return self._track_on_device(e) def remove_track(self, track): self.notify('status', _('Removing %s') % track.title) util.delete_file(track.filename) directory = os.path.dirname(track.filename) if self.directory_is_empty(directory) and self._config.one_folder_per_podcast: try: os.rmdir(directory) except: logger.error('Cannot remove %s', directory) def directory_is_empty(self, directory): files = glob.glob(os.path.join(directory, '*')) dotfiles = glob.glob(os.path.join(directory, '.*')) return len(files+dotfiles) == 0 class MTPDevice(Device): def __init__(self, config): Device.__init__(self, config) self.__model_name = None try: self.__MTPDevice = MTP() except NameError, e: # pymtp not available / not installed (see bug 924) logger.error('pymtp not found: %s', str(e)) self.__MTPDevice = None def __callback(self, sent, total): if self.cancelled: return -1 percentage = round(float(sent)/float(total)*100) text = ('%i%%' % percentage) self.notify('progress', sent, total, text) def __date_to_mtp(self, date): """ this function format the given date and time to a string representation according to MTP specifications: YYYYMMDDThhmmss.s return the string representation od the given date """ if not date: return "" try: d = time.gmtime(date) return time.strftime("%Y%m%d-%H%M%S.0Z", d) except Exception, exc: logger.error('ERROR: An error has happend while trying to convert date to an mtp string') return None def __mtp_to_date(self, mtp): """ this parse the mtp's string representation for date according to specifications (YYYYMMDDThhmmss.s) to a python time object """ if not mtp: return None try: mtp = mtp.replace(" ", "0") # replace blank with 0 to fix some invalid string d = time.strptime(mtp[:8] + mtp[9:13],"%Y%m%d%H%M%S") _date = calendar.timegm(d) if len(mtp)==20: # TIME ZONE SHIFTING: the string contains a hour/min shift relative to a time zone try: shift_direction=mtp[15] hour_shift = int(mtp[16:18]) minute_shift = int(mtp[18:20]) shift_in_sec = hour_shift * 3600 + minute_shift * 60 if shift_direction == "+": _date += shift_in_sec elif shift_direction == "-": _date -= shift_in_sec else: raise ValueError("Expected + or -") except Exception, exc: logger.warning('WARNING: ignoring invalid time zone information for %s (%s)') return max( 0, _date ) except Exception, exc: logger.warning('WARNING: the mtp date "%s" can not be parsed against mtp specification (%s)') return None def get_name(self): """ this function try to find a nice name for the device. First, it tries to find a friendly (user assigned) name (this name can be set by other application and is stored on the device). if no friendly name was assign, it tries to get the model name (given by the vendor). If no name is found at all, a generic one is returned. Once found, the name is cached internaly to prevent reading again the device return the name of the device """ if self.__model_name: return self.__model_name if self.__MTPDevice is None: return _('MTP device') self.__model_name = self.__MTPDevice.get_devicename() # actually libmtp.Get_Friendlyname if not self.__model_name or self.__model_name == "?????": self.__model_name = self.__MTPDevice.get_modelname() if not self.__model_name: self.__model_name = _('MTP device') return self.__model_name def open(self): Device.open(self) logger.info("opening the MTP device") self.notify('status', _('Opening the MTP device'), ) try: self.__MTPDevice.connect() # build the initial tracks_list self.tracks_list = self.get_all_tracks() except Exception, exc: logger.error('unable to find an MTP device (%s)') return False self.notify('status', _('%s opened') % self.get_name()) return True def close(self): logger.info("closing %s", self.get_name()) self.notify('status', _('Closing %s') % self.get_name()) try: self.__MTPDevice.disconnect() except Exception, exc: logger.error('unable to close %s (%s)', self.get_name()) return False self.notify('status', _('%s closed') % self.get_name()) Device.close(self) return True def add_track(self, episode): self.notify('status', _('Adding %s...') % episode.title) filename = str(self.convert_track(episode)) logger.info("sending %s (%s).", filename, episode.title) try: # verify free space needed = util.calculate_size(filename) free = self.get_free_space() if needed > free: logger.error('Not enough space on device %s: %s available, but need at least %s', self.get_name(), util.format_filesize(free), util.format_filesize(needed)) self.cancelled = True return False # fill metadata metadata = pymtp.LIBMTP_Track() metadata.title = str(episode.title) metadata.artist = str(episode.channel.title) metadata.album = str(episode.channel.title) metadata.genre = "podcast" metadata.date = self.__date_to_mtp(episode.pubdate) metadata.duration = get_track_length(str(filename)) folder_name = '' if episode.mimetype.startswith('audio/') and self._config.mtp_audio_folder: folder_name = self._config.mtp_audio_folder if episode.mimetype.startswith('video/') and self._config.mtp_video_folder: folder_name = self._config.mtp_video_folder if episode.mimetype.startswith('image/') and self._config.mtp_image_folder: folder_name = self._config.mtp_image_folder if folder_name != '' and self._config.mtp_podcast_folders: folder_name += os.path.sep + str(episode.channel.title) # log('Target MTP folder: %s' % folder_name) if folder_name == '': folder_id = 0 else: folder_id = self.__MTPDevice.mkdir(folder_name) # send the file to_file = util.sanitize_filename(metadata.title) + episode.extension() self.__MTPDevice.send_track_from_file(filename, to_file, metadata, folder_id, callback=self.__callback) if gpodder.user_hooks is not None: gpodder.user_hooks.on_file_copied_to_mtp(self, filename, to_file) except: logger.error('unable to add episode %s', episode.title) return False return True def remove_track(self, sync_track): self.notify('status', _('Removing %s') % sync_track.mtptrack.title) logger.info("removing %s", sync_track.mtptrack.title) try: self.__MTPDevice.delete_object(sync_track.mtptrack.item_id) except Exception, exc: logger.error('unable remove file %s (%s)', sync_track.mtptrack.filename) logger.info('%s removed', sync_track.mtptrack.title) def get_all_tracks(self): try: listing = self.__MTPDevice.get_tracklisting(callback=self.__callback) except Exception, exc: logger.error('unable to get file listing %s (%s)') tracks = [] for track in listing: title = track.title if not title or title=="": title=track.filename if len(title) > 50: title = title[0:49] + '...' artist = track.artist if artist and len(artist) > 50: artist = artist[0:49] + '...' length = track.filesize age_in_days = 0 date = self.__mtp_to_date(track.date) if not date: modified = track.date # not a valid mtp date. Display what mtp gave anyway modified_sort = -1 # no idea how to sort invalid date else: modified = util.format_date(date) modified_sort = date t = SyncTrack(title, length, modified, modified_sort=modified_sort, mtptrack=track, podcast=artist) tracks.append(t) return tracks def get_free_space(self): if self.__MTPDevice is not None: return self.__MTPDevice.get_freespace() else: return 0 class SyncCancelledException(Exception): pass class SyncTask(download.DownloadTask): # An object representing the synchronization task of an episode # Possible states this sync task can be in STATUS_MESSAGE = (_('Added'), _('Queued'), _('Synchronizing'), _('Finished'), _('Failed'), _('Cancelled'), _('Paused')) (INIT, QUEUED, DOWNLOADING, DONE, FAILED, CANCELLED, PAUSED) = range(7) def __str__(self): return self.__episode.title def __get_status(self): return self.__status def __set_status(self, status): if status != self.__status: self.__status_changed = True self.__status = status status = property(fget=__get_status, fset=__set_status) def __get_device(self): return self.__device def __set_device(self, device): self.__device = device device = property(fget=__get_device, fset=__set_device) def __get_status_changed(self): if self.__status_changed: self.__status_changed = False return True else: return False status_changed = property(fget=__get_status_changed) def __get_activity(self): return self.__activity def __set_activity(self, activity): self.__activity = activity activity = property(fget=__get_activity, fset=__set_activity) def __get_empty_string(self): return '' url = property(fget=__get_empty_string) podcast_url = property(fget=__get_empty_string) def __get_episode(self): return self.__episode episode = property(fget=__get_episode) def cancel(self): if self.status in (self.DOWNLOADING, self.QUEUED): self.status = self.CANCELLED def removed_from_list(self): # XXX: Should we delete temporary/incomplete files here? pass def __init__(self, episode): self.__status = SyncTask.INIT self.__activity = SyncTask.ACTIVITY_SYNCHRONIZE self.__status_changed = True self.__episode = episode # Create the target filename and save it in the database self.filename = self.__episode.local_filename(create=False) self.tempname = self.filename + '.partial' self.total_size = self.__episode.file_size self.speed = 0.0 self.progress = 0.0 self.error_message = None # Have we already shown this task in a notification? self._notification_shown = False # Variables for speed limit and speed calculation self.__start_time = 0 self.__start_blocks = 0 self.__limit_rate_value = 999 self.__limit_rate = 999 # Callbacks self._progress_updated = lambda x: None def notify_as_finished(self): if self.status == SyncTask.DONE: if self._notification_shown: return False else: self._notification_shown = True return True return False def notify_as_failed(self): if self.status == SyncTask.FAILED: if self._notification_shown: return False else: self._notification_shown = True return True return False def add_progress_callback(self, callback): self._progress_updated = callback def status_updated(self, count, blockSize, totalSize): # We see a different "total size" while downloading, # so correct the total size variable in the thread if totalSize != self.total_size and totalSize > 0: self.total_size = float(totalSize) if self.total_size > 0: self.progress = max(0.0, min(1.0, float(count*blockSize)/self.total_size)) self._progress_updated(self.progress) if self.status == SyncTask.CANCELLED: raise SyncCancelledException() if self.status == SyncTask.PAUSED: raise SyncCancelledException() def recycle(self): self.episode.download_task = None def run(self): # Speed calculation (re-)starts here self.__start_time = 0 self.__start_blocks = 0 # If the download has already been cancelled, skip it if self.status == SyncTask.CANCELLED: util.delete_file(self.tempname) self.progress = 0.0 self.speed = 0.0 return False # We only start this download if its status is "queued" if self.status != SyncTask.QUEUED: return False # We are synching this file right now self.status = SyncTask.DOWNLOADING self._notification_shown = False try: logger.info('Starting SyncTask') self.device.add_track(self.episode, reporthook=self.status_updated) except Exception, e: self.status = SyncTask.FAILED logger.error('Download failed: %s', str(e), exc_info=True) self.error_message = _('Error: %s') % (str(e),) if self.status == SyncTask.DOWNLOADING: # Everything went well - we're done self.status = SyncTask.DONE if self.total_size <= 0: self.total_size = util.calculate_size(self.filename) logger.info('Total size updated to %d', self.total_size) self.progress = 1.0 gpodder.user_extensions.on_episode_downloaded(self.__episode) return True self.speed = 0.0 # We finished, but not successfully (at least not really) return False gpodder-3.5.2/src/gpodder/unittests.py0000644000175000017500000000640112220076757017415 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Run Doctests and Unittests for gPodder modules # 2009-02-25 Thomas Perl import doctest import unittest import sys try: # Unused here locally, but we import it to be able to give an early # warning about this missing dependency in order to avoid bogus errors. import minimock except ImportError, e: print >>sys.stderr, """ Error: Unit tests require the "minimock" module (python-minimock). Please install it before running the unit tests. """ sys.exit(2) # Main package and test package (for modules in main package) package = 'gpodder' test_package = '.'.join((package, 'test')) suite = unittest.TestSuite() coverage_modules = [] # Modules (in gpodder) for which doctests exist # ex: Doctests embedded in "gpodder.util", coverage reported for "gpodder.util" doctest_modules = ['util', 'jsonconfig'] for module in doctest_modules: doctest_mod = __import__('.'.join((package, module)), fromlist=[module]) suite.addTest(doctest.DocTestSuite(doctest_mod)) coverage_modules.append(doctest_mod) # Modules (in gpodder) for which unit tests (in gpodder.test) exist # ex: Tests are in "gpodder.test.model", coverage reported for "gpodder.model" test_modules = ['model'] for module in test_modules: test_mod = __import__('.'.join((test_package, module)), fromlist=[module]) coverage_mod = __import__('.'.join((package, module)), fromlist=[module]) suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_mod)) coverage_modules.append(coverage_mod) try: # If you want a HTML-based test report, install HTMLTestRunner from: # http://tungwaiyip.info/software/HTMLTestRunner.html import HTMLTestRunner REPORT_FILENAME = 'test_report.html' runner = HTMLTestRunner.HTMLTestRunner(stream=open(REPORT_FILENAME, 'w')) print """ HTML Test Report will be written to %s """ % REPORT_FILENAME except ImportError: runner = unittest.TextTestRunner(verbosity=2) try: import coverage except ImportError: coverage = None if __name__ == '__main__': if coverage is not None: coverage.erase() coverage.start() result = runner.run(suite) if not result.wasSuccessful(): sys.exit(1) if coverage is not None: coverage.stop() coverage.report(coverage_modules) coverage.erase() else: print >>sys.stderr, """ No coverage reporting done (Python module "coverage" is missing) Please install the python-coverage package to get coverage reporting. """ gpodder-3.5.2/src/gpodder/util.py0000644000175000017500000015175612220076757016346 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # Copyright (c) 2011 Neal H. Walfield # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # util.py -- Misc utility functions # Thomas Perl 2007-08-04 # """Miscellaneous helper functions for gPodder This module provides helper and utility functions for gPodder that are not tied to any specific part of gPodder. """ import gpodder import logging logger = logging.getLogger(__name__) import os import os.path import platform import glob import stat import shlex import shutil import socket import sys import string import re import subprocess from htmlentitydefs import entitydefs import time import gzip import datetime import threading import urlparse import urllib import urllib2 import httplib import webbrowser import mimetypes import itertools import feedparser import StringIO import xml.dom.minidom if gpodder.ui.win32: try: import win32file except ImportError: logger.warn('Running on Win32 but win32api/win32file not installed.') win32file = None _ = gpodder.gettext N_ = gpodder.ngettext import locale try: locale.setlocale(locale.LC_ALL, '') except Exception, e: logger.warn('Cannot set locale (%s)', e, exc_info=True) # Native filesystem encoding detection encoding = sys.getfilesystemencoding() if encoding is None: if 'LANG' in os.environ and '.' in os.environ['LANG']: lang = os.environ['LANG'] (language, encoding) = lang.rsplit('.', 1) logger.info('Detected encoding: %s', encoding) elif gpodder.ui.harmattan or gpodder.ui.sailfish: encoding = 'utf-8' elif gpodder.ui.win32: # To quote http://docs.python.org/howto/unicode.html: # ,,on Windows, Python uses the name "mbcs" to refer # to whatever the currently configured encoding is`` encoding = 'mbcs' else: encoding = 'iso-8859-15' logger.info('Assuming encoding: ISO-8859-15 ($LANG not set).') # Filename / folder name sanitization def _sanitize_char(c): if c in string.whitespace: return ' ' elif c in ',-.()': return c elif c in string.punctuation or ord(c) <= 31: return '_' return c SANITIZATION_TABLE = ''.join(map(_sanitize_char, map(chr, range(256)))) del _sanitize_char _MIME_TYPE_LIST = [ ('.aac', 'audio/aac'), ('.axa', 'audio/annodex'), ('.flac', 'audio/flac'), ('.m4b', 'audio/m4b'), ('.m4a', 'audio/mp4'), ('.mp3', 'audio/mpeg'), ('.spx', 'audio/ogg'), ('.oga', 'audio/ogg'), ('.ogg', 'audio/ogg'), ('.wma', 'audio/x-ms-wma'), ('.3gp', 'video/3gpp'), ('.axv', 'video/annodex'), ('.divx', 'video/divx'), ('.m4v', 'video/m4v'), ('.mp4', 'video/mp4'), ('.ogv', 'video/ogg'), ('.mov', 'video/quicktime'), ('.flv', 'video/x-flv'), ('.mkv', 'video/x-matroska'), ('.wmv', 'video/x-ms-wmv'), ('.opus', 'audio/opus'), ] _MIME_TYPES = dict((k, v) for v, k in _MIME_TYPE_LIST) _MIME_TYPES_EXT = dict(_MIME_TYPE_LIST) def make_directory( path): """ Tries to create a directory if it does not exist already. Returns True if the directory exists after the function call, False otherwise. """ if os.path.isdir( path): return True try: os.makedirs( path) except: logger.warn('Could not create directory: %s', path) return False return True def normalize_feed_url(url): """ Converts any URL to http:// or ftp:// so that it can be used with "wget". If the URL cannot be converted (invalid or unknown scheme), "None" is returned. This will also normalize feed:// and itpc:// to http://. >>> normalize_feed_url('itpc://example.org/podcast.rss') 'http://example.org/podcast.rss' If no URL scheme is defined (e.g. "curry.com"), we will simply assume the user intends to add a http:// feed. >>> normalize_feed_url('curry.com') 'http://curry.com/' There are even some more shortcuts for advanced users and lazy typists (see the source for details). >>> normalize_feed_url('fb:43FPodcast') 'http://feeds.feedburner.com/43FPodcast' It will also take care of converting the domain name to all-lowercase (because domains are not case sensitive): >>> normalize_feed_url('http://Example.COM/') 'http://example.com/' Some other minimalistic changes are also taken care of, e.g. a ? with an empty query is removed: >>> normalize_feed_url('http://example.org/test?') 'http://example.org/test' """ if not url or len(url) < 8: return None # This is a list of prefixes that you can use to minimize the amount of # keystrokes that you have to use. # Feel free to suggest other useful prefixes, and I'll add them here. PREFIXES = { 'fb:': 'http://feeds.feedburner.com/%s', 'yt:': 'http://www.youtube.com/rss/user/%s/videos.rss', 'sc:': 'http://soundcloud.com/%s', 'fm4od:': 'http://onapp1.orf.at/webcam/fm4/fod/%s.xspf', # YouTube playlists. To get a list of playlists per-user, use: # https://gdata.youtube.com/feeds/api/users//playlists 'ytpl:': 'http://gdata.youtube.com/feeds/api/playlists/%s', } for prefix, expansion in PREFIXES.iteritems(): if url.startswith(prefix): url = expansion % (url[len(prefix):],) break # Assume HTTP for URLs without scheme if not '://' in url: url = 'http://' + url scheme, netloc, path, query, fragment = urlparse.urlsplit(url) # Schemes and domain names are case insensitive scheme, netloc = scheme.lower(), netloc.lower() # Normalize empty paths to "/" if path == '': path = '/' # feed://, itpc:// and itms:// are really http:// if scheme in ('feed', 'itpc', 'itms'): scheme = 'http' if scheme not in ('http', 'https', 'ftp', 'file'): return None # urlunsplit might return "a slighty different, but equivalent URL" return urlparse.urlunsplit((scheme, netloc, path, query, fragment)) def username_password_from_url(url): r""" Returns a tuple (username,password) containing authentication data from the specified URL or (None,None) if no authentication data can be found in the URL. See Section 3.1 of RFC 1738 (http://www.ietf.org/rfc/rfc1738.txt) >>> username_password_from_url('https://@host.com/') ('', None) >>> username_password_from_url('telnet://host.com/') (None, None) >>> username_password_from_url('ftp://foo:@host.com/') ('foo', '') >>> username_password_from_url('http://a:b@host.com/') ('a', 'b') >>> username_password_from_url(1) Traceback (most recent call last): ... ValueError: URL has to be a string or unicode object. >>> username_password_from_url(None) Traceback (most recent call last): ... ValueError: URL has to be a string or unicode object. >>> username_password_from_url('http://a@b:c@host.com/') ('a@b', 'c') >>> username_password_from_url('ftp://a:b:c@host.com/') ('a', 'b:c') >>> username_password_from_url('http://i%2Fo:P%40ss%3A@host.com/') ('i/o', 'P@ss:') >>> username_password_from_url('ftp://%C3%B6sterreich@host.com/') ('\xc3\xb6sterreich', None) >>> username_password_from_url('http://w%20x:y%20z@example.org/') ('w x', 'y z') >>> username_password_from_url('http://example.com/x@y:z@test.com/') (None, None) """ if type(url) not in (str, unicode): raise ValueError('URL has to be a string or unicode object.') (username, password) = (None, None) (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url) if '@' in netloc: (authentication, netloc) = netloc.rsplit('@', 1) if ':' in authentication: (username, password) = authentication.split(':', 1) # RFC1738 dictates that we should not allow ['/', '@', ':'] # characters in the username and password field (Section 3.1): # # 1. The "/" can't be in there at this point because of the way # urlparse (which we use above) works. # 2. Due to gPodder bug 1521, we allow "@" in the username and # password field. We use netloc.rsplit('@', 1), which will # make sure that we split it at the last '@' in netloc. # 3. The colon must be excluded (RFC2617, Section 2) in the # username, but is apparently allowed in the password. This # is handled by the authentication.split(':', 1) above, and # will cause any extraneous ':'s to be part of the password. username = urllib.unquote(username) password = urllib.unquote(password) else: username = urllib.unquote(authentication) return (username, password) def directory_is_writable(path): """ Returns True if the specified directory exists and is writable by the current user. """ return os.path.isdir(path) and os.access(path, os.W_OK) def calculate_size( path): """ Tries to calculate the size of a directory, including any subdirectories found. The returned value might not be correct if the user doesn't have appropriate permissions to list all subdirectories of the given path. """ if path is None: return 0L if os.path.dirname( path) == '/': return 0L if os.path.isfile( path): return os.path.getsize( path) if os.path.isdir( path) and not os.path.islink( path): sum = os.path.getsize( path) try: for item in os.listdir(path): try: sum += calculate_size(os.path.join(path, item)) except: logger.warn('Cannot get size for %s', path, exc_info=True) except: logger.warn('Cannot access %s', path, exc_info=True) return sum return 0L def file_modification_datetime(filename): """ Returns the modification date of the specified file as a datetime.datetime object or None if the modification date cannot be determined. """ if filename is None: return None if not os.access(filename, os.R_OK): return None try: s = os.stat(filename) timestamp = s[stat.ST_MTIME] return datetime.datetime.fromtimestamp(timestamp) except: logger.warn('Cannot get mtime for %s', filename, exc_info=True) return None def file_age_in_days(filename): """ Returns the age of the specified filename in days or zero if the modification date cannot be determined. """ dt = file_modification_datetime(filename) if dt is None: return 0 else: return (datetime.datetime.now()-dt).days def file_modification_timestamp(filename): """ Returns the modification date of the specified file as a number or -1 if the modification date cannot be determined. """ if filename is None: return -1 try: s = os.stat(filename) return s[stat.ST_MTIME] except: logger.warn('Cannot get modification timestamp for %s', filename) return -1 def file_age_to_string(days): """ Converts a "number of days" value to a string that can be used in the UI to display the file age. >>> file_age_to_string(0) '' >>> file_age_to_string(1) u'1 day ago' >>> file_age_to_string(2) u'2 days ago' """ if days < 1: return '' else: return N_('%(count)d day ago', '%(count)d days ago', days) % {'count':days} def is_system_file(filename): """ Checks to see if the given file is a system file. """ if gpodder.ui.win32 and win32file is not None: result = win32file.GetFileAttributes(filename) #-1 is returned by GetFileAttributes when an error occurs #0x4 is the FILE_ATTRIBUTE_SYSTEM constant return result != -1 and result & 0x4 != 0 else: return False def get_free_disk_space_win32(path): """ Win32-specific code to determine the free disk space remaining for a given path. Uses code from: http://mail.python.org/pipermail/python-list/2003-May/203223.html """ if win32file is None: # Cannot determine free disk space return 0 drive, tail = os.path.splitdrive(path) userFree, userTotal, freeOnDisk = win32file.GetDiskFreeSpaceEx(drive) return userFree def get_free_disk_space(path): """ Calculates the free disk space available to the current user on the file system that contains the given path. If the path (or its parent folder) does not yet exist, this function returns zero. """ if not os.path.exists(path): return 0 if gpodder.ui.win32: return get_free_disk_space_win32(path) s = os.statvfs(path) return s.f_bavail * s.f_bsize def format_date(timestamp): """ Converts a UNIX timestamp to a date representation. This function returns "Today", "Yesterday", a weekday name or the date in %x format, which (according to the Python docs) is the "Locale's appropriate date representation". Returns None if there has been an error converting the timestamp to a string representation. """ if timestamp is None: return None seconds_in_a_day = 60*60*24 today = time.localtime()[:3] yesterday = time.localtime(time.time() - seconds_in_a_day)[:3] try: timestamp_date = time.localtime(timestamp)[:3] except ValueError, ve: logger.warn('Cannot convert timestamp', exc_info=True) return None if timestamp_date == today: return _('Today') elif timestamp_date == yesterday: return _('Yesterday') try: diff = int( (time.time() - timestamp)/seconds_in_a_day ) except: logger.warn('Cannot convert "%s" to date.', timestamp, exc_info=True) return None try: timestamp = datetime.datetime.fromtimestamp(timestamp) except: return None if diff < 7: # Weekday name return str(timestamp.strftime('%A').decode(encoding)) else: # Locale's appropriate date representation return str(timestamp.strftime('%x')) def format_filesize(bytesize, use_si_units=False, digits=2): """ Formats the given size in bytes to be human-readable, Returns a localized "(unknown)" string when the bytesize has a negative value. """ si_units = ( ( 'kB', 10**3 ), ( 'MB', 10**6 ), ( 'GB', 10**9 ), ) binary_units = ( ( 'KiB', 2**10 ), ( 'MiB', 2**20 ), ( 'GiB', 2**30 ), ) try: bytesize = float( bytesize) except: return _('(unknown)') if bytesize < 0: return _('(unknown)') if use_si_units: units = si_units else: units = binary_units ( used_unit, used_value ) = ( 'B', bytesize ) for ( unit, value ) in units: if bytesize >= value: used_value = bytesize / float(value) used_unit = unit return ('%.'+str(digits)+'f %s') % (used_value, used_unit) def delete_file(filename): """Delete a file from the filesystem Errors (permissions errors or file not found) are silently ignored. """ try: os.remove(filename) except: pass def remove_html_tags(html): """ Remove HTML tags from a string and replace numeric and named entities with the corresponding character, so the HTML text can be displayed in a simple text view. """ if html is None: return None # If we would want more speed, we could make these global re_strip_tags = re.compile('<[^>]*>') re_unicode_entities = re.compile('&#(\d{2,4});') re_html_entities = re.compile('&(.{2,8});') re_newline_tags = re.compile('(]*>|<[/]?ul[^>]*>|)', re.I) re_listing_tags = re.compile(']*>', re.I) result = html # Convert common HTML elements to their text equivalent result = re_newline_tags.sub('\n', result) result = re_listing_tags.sub('\n * ', result) result = re.sub('<[Pp]>', '\n\n', result) # Remove all HTML/XML tags from the string result = re_strip_tags.sub('', result) # Convert numeric XML entities to their unicode character result = re_unicode_entities.sub(lambda x: unichr(int(x.group(1))), result) # Convert named HTML entities to their unicode character result = re_html_entities.sub(lambda x: unicode(entitydefs.get(x.group(1),''), 'iso-8859-1'), result) # Convert more than two newlines to two newlines result = re.sub('([\r\n]{2})([\r\n])+', '\\1', result) return result.strip() def wrong_extension(extension): """ Determine if a given extension looks like it's wrong (e.g. empty, extremely long or spaces) Returns True if the extension most likely is a wrong one and should be replaced. >>> wrong_extension('.mp3') False >>> wrong_extension('.divx') False >>> wrong_extension('mp3') True >>> wrong_extension('') True >>> wrong_extension('.12 - Everybody') True >>> wrong_extension('.mp3 ') True >>> wrong_extension('.') True >>> wrong_extension('.42') True """ if not extension: return True elif len(extension) > 5: return True elif ' ' in extension: return True elif extension == '.': return True elif not extension.startswith('.'): return True else: try: # "." is an invalid extension float(extension) return True except: pass return False def extension_from_mimetype(mimetype): """ Simply guesses what the file extension should be from the mimetype >>> extension_from_mimetype('audio/mp4') '.m4a' >>> extension_from_mimetype('audio/ogg') '.ogg' >>> extension_from_mimetype('audio/mpeg') '.mp3' >>> extension_from_mimetype('video/x-matroska') '.mkv' >>> extension_from_mimetype('wrong-mimetype') '' """ if mimetype in _MIME_TYPES: return _MIME_TYPES[mimetype] return mimetypes.guess_extension(mimetype) or '' def mimetype_from_extension(extension): """ Simply guesses what the mimetype should be from the file extension >>> mimetype_from_extension('.m4a') 'audio/mp4' >>> mimetype_from_extension('.ogg') 'audio/ogg' >>> mimetype_from_extension('.mp3') 'audio/mpeg' >>> mimetype_from_extension('.mkv') 'video/x-matroska' >>> mimetype_from_extension('._invalid_file_extension_') '' """ if extension in _MIME_TYPES_EXT: return _MIME_TYPES_EXT[extension] # Need to prepend something to the extension, so guess_type works type, encoding = mimetypes.guess_type('file'+extension) return type or '' def extension_correct_for_mimetype(extension, mimetype): """ Check if the given filename extension (e.g. ".ogg") is a possible extension for a given mimetype (e.g. "application/ogg") and return a boolean value (True if it's possible, False if not). Also do >>> extension_correct_for_mimetype('.ogg', 'application/ogg') True >>> extension_correct_for_mimetype('.ogv', 'video/ogg') True >>> extension_correct_for_mimetype('.ogg', 'audio/mpeg') False >>> extension_correct_for_mimetype('.m4a', 'audio/mp4') True >>> extension_correct_for_mimetype('mp3', 'audio/mpeg') Traceback (most recent call last): ... ValueError: "mp3" is not an extension (missing .) >>> extension_correct_for_mimetype('.mp3', 'audio mpeg') Traceback (most recent call last): ... ValueError: "audio mpeg" is not a mimetype (missing /) """ if not '/' in mimetype: raise ValueError('"%s" is not a mimetype (missing /)' % mimetype) if not extension.startswith('.'): raise ValueError('"%s" is not an extension (missing .)' % extension) if (extension, mimetype) in _MIME_TYPE_LIST: return True # Create a "default" extension from the mimetype, e.g. "application/ogg" # becomes ".ogg", "audio/mpeg" becomes ".mpeg", etc... default = ['.'+mimetype.split('/')[-1]] return extension in default+mimetypes.guess_all_extensions(mimetype) def filename_from_url(url): """ Extracts the filename and (lowercase) extension (with dot) from a URL, e.g. http://server.com/file.MP3?download=yes will result in the string ("file", ".mp3") being returned. This function will also try to best-guess the "real" extension for a media file (audio, video) by trying to match an extension to these types and recurse into the query string to find better matches, if the original extension does not resolve to a known type. http://my.net/redirect.php?my.net/file.ogg => ("file", ".ogg") http://server/get.jsp?file=/episode0815.MOV => ("episode0815", ".mov") http://s/redirect.mp4?http://serv2/test.mp4 => ("test", ".mp4") """ (scheme, netloc, path, para, query, fragid) = urlparse.urlparse(url) (filename, extension) = os.path.splitext(os.path.basename( urllib.unquote(path))) if file_type_by_extension(extension) is not None and not \ query.startswith(scheme+'://'): # We have found a valid extension (audio, video) # and the query string doesn't look like a URL return ( filename, extension.lower() ) # If the query string looks like a possible URL, try that first if len(query.strip()) > 0 and query.find('/') != -1: query_url = '://'.join((scheme, urllib.unquote(query))) (query_filename, query_extension) = filename_from_url(query_url) if file_type_by_extension(query_extension) is not None: return os.path.splitext(os.path.basename(query_url)) # No exact match found, simply return the original filename & extension return ( filename, extension.lower() ) def file_type_by_extension(extension): """ Tries to guess the file type by looking up the filename extension from a table of known file types. Will return "audio", "video" or None. >>> file_type_by_extension('.aif') 'audio' >>> file_type_by_extension('.3GP') 'video' >>> file_type_by_extension('.m4a') 'audio' >>> file_type_by_extension('.txt') is None True >>> file_type_by_extension(None) is None True >>> file_type_by_extension('ogg') Traceback (most recent call last): ... ValueError: Extension does not start with a dot: ogg """ if not extension: return None if not extension.startswith('.'): raise ValueError('Extension does not start with a dot: %s' % extension) extension = extension.lower() if extension in _MIME_TYPES_EXT: return _MIME_TYPES_EXT[extension].split('/')[0] # Need to prepend something to the extension, so guess_type works type, encoding = mimetypes.guess_type('file'+extension) if type is not None and '/' in type: filetype, rest = type.split('/', 1) if filetype in ('audio', 'video', 'image'): return filetype return None def get_first_line( s): """ Returns only the first line of a string, stripped so that it doesn't have whitespace before or after. """ return s.strip().split('\n')[0].strip() def object_string_formatter(s, **kwargs): """ Makes attributes of object passed in as keyword arguments available as {OBJECTNAME.ATTRNAME} in the passed-in string and returns a string with the above arguments replaced with the attribute values of the corresponding object. >>> class x: pass >>> a = x() >>> a.title = 'Hello world' >>> object_string_formatter('{episode.title}', episode=a) 'Hello world' >>> class x: pass >>> a = x() >>> a.published = 123 >>> object_string_formatter('Hi {episode.published} 456', episode=a) 'Hi 123 456' """ result = s for key, o in kwargs.iteritems(): matches = re.findall(r'\{%s\.([^\}]+)\}' % key, s) for attr in matches: if hasattr(o, attr): try: from_s = '{%s.%s}' % (key, attr) to_s = str(getattr(o, attr)) result = result.replace(from_s, to_s) except: logger.warn('Replace of "%s" failed for "%s".', attr, s) return result def format_desktop_command(command, filenames, start_position=None): """ Formats a command template from the "Exec=" line of a .desktop file to a string that can be invoked in a shell. Handled format strings: %U, %u, %F, %f and a fallback that appends the filename as first parameter of the command. Also handles non-standard %p which is replaced with the start_position (probably only makes sense if starting a single file). (see bug 1140) See http://standards.freedesktop.org/desktop-entry-spec/1.0/ar01s06.html Returns a list of commands to execute, either one for each filename if the application does not support multiple file names or one for all filenames (%U, %F or unknown). """ # Replace backslashes with slashes to fix win32 issues # (even on win32, "/" works, but "\" does not) command = command.replace('\\', '/') if start_position is not None: command = command.replace('%p', str(start_position)) command = shlex.split(command) command_before = command command_after = [] multiple_arguments = True for fieldcode in ('%U', '%F', '%u', '%f'): if fieldcode in command: command_before = command[:command.index(fieldcode)] command_after = command[command.index(fieldcode)+1:] multiple_arguments = fieldcode in ('%U', '%F') break if multiple_arguments: return [command_before + filenames + command_after] commands = [] for filename in filenames: commands.append(command_before+[filename]+command_after) return commands def url_strip_authentication(url): """ Strips authentication data from an URL. Returns the URL with the authentication data removed from it. >>> url_strip_authentication('https://host.com/') 'https://host.com/' >>> url_strip_authentication('telnet://foo:bar@host.com/') 'telnet://host.com/' >>> url_strip_authentication('ftp://billy@example.org') 'ftp://example.org' >>> url_strip_authentication('ftp://billy:@example.org') 'ftp://example.org' >>> url_strip_authentication('http://aa:bc@localhost/x') 'http://localhost/x' >>> url_strip_authentication('http://i%2Fo:P%40ss%3A@blubb.lan/u.html') 'http://blubb.lan/u.html' >>> url_strip_authentication('http://c:d@x.org/') 'http://x.org/' >>> url_strip_authentication('http://P%40%3A:i%2F@cx.lan') 'http://cx.lan' >>> url_strip_authentication('http://x@x.com:s3cret@example.com/') 'http://example.com/' """ url_parts = list(urlparse.urlsplit(url)) # url_parts[1] is the HOST part of the URL # Remove existing authentication data if '@' in url_parts[1]: url_parts[1] = url_parts[1].rsplit('@', 1)[1] return urlparse.urlunsplit(url_parts) def url_add_authentication(url, username, password): """ Adds authentication data (username, password) to a given URL in order to construct an authenticated URL. >>> url_add_authentication('https://host.com/', '', None) 'https://host.com/' >>> url_add_authentication('http://example.org/', None, None) 'http://example.org/' >>> url_add_authentication('telnet://host.com/', 'foo', 'bar') 'telnet://foo:bar@host.com/' >>> url_add_authentication('ftp://example.org', 'billy', None) 'ftp://billy@example.org' >>> url_add_authentication('ftp://example.org', 'billy', '') 'ftp://billy:@example.org' >>> url_add_authentication('http://localhost/x', 'aa', 'bc') 'http://aa:bc@localhost/x' >>> url_add_authentication('http://blubb.lan/u.html', 'i/o', 'P@ss:') 'http://i%2Fo:P@ss:@blubb.lan/u.html' >>> url_add_authentication('http://a:b@x.org/', 'c', 'd') 'http://c:d@x.org/' >>> url_add_authentication('http://i%2F:P%40%3A@cx.lan', 'P@x', 'i/') 'http://P@x:i%2F@cx.lan' >>> url_add_authentication('http://x.org/', 'a b', 'c d') 'http://a%20b:c%20d@x.org/' """ if username is None or username == '': return url # Relaxations of the strict quoting rules (bug 1521): # 1. Accept '@' in username and password # 2. Acecpt ':' in password only username = urllib.quote(username, safe='@') if password is not None: password = urllib.quote(password, safe='@:') auth_string = ':'.join((username, password)) else: auth_string = username url = url_strip_authentication(url) url_parts = list(urlparse.urlsplit(url)) # url_parts[1] is the HOST part of the URL url_parts[1] = '@'.join((auth_string, url_parts[1])) return urlparse.urlunsplit(url_parts) def urlopen(url, headers=None, data=None, timeout=None): """ An URL opener with the User-agent set to gPodder (with version) """ username, password = username_password_from_url(url) if username is not None or password is not None: url = url_strip_authentication(url) password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() password_mgr.add_password(None, url, username, password) handler = urllib2.HTTPBasicAuthHandler(password_mgr) opener = urllib2.build_opener(handler) else: opener = urllib2.build_opener() if headers is None: headers = {} else: headers = dict(headers) headers.update({'User-agent': gpodder.user_agent}) request = urllib2.Request(url, data=data, headers=headers) if timeout is None: return opener.open(request) else: return opener.open(request, timeout=timeout) def get_real_url(url): """ Gets the real URL of a file and resolves all redirects. """ try: return urlopen(url).geturl() except: logger.error('Getting real url for %s', url, exc_info=True) return url def find_command(command): """ Searches the system's PATH for a specific command that is executable by the user. Returns the first occurence of an executable binary in the PATH, or None if the command is not available. On Windows, this also looks for ".bat" and ".exe" files if "" itself doesn't exist. """ if 'PATH' not in os.environ: return None for path in os.environ['PATH'].split(os.pathsep): command_file = os.path.join(path, command) if gpodder.ui.win32 and not os.path.exists(command_file): for extension in ('.bat', '.exe'): cmd = command_file + extension if os.path.isfile(cmd): command_file = cmd break if os.path.isfile(command_file) and os.access(command_file, os.X_OK): return command_file return None idle_add_handler = None def idle_add(func, *args): """Run a function in the main GUI thread This is a wrapper function that does the Right Thing depending on if we are running on Gtk+, Qt or CLI. You should use this function if you are calling from a Python thread and modify UI data, so that you make sure that the function is called as soon as possible from the main UI thread. """ if gpodder.ui.gtk: import gobject gobject.idle_add(func, *args) elif gpodder.ui.qml: from PySide.QtCore import Signal, QTimer, QThread, Qt, QObject class IdleAddHandler(QObject): signal = Signal(object) def __init__(self): QObject.__init__(self) self.main_thread_id = QThread.currentThreadId() self.signal.connect(self.run_func) def run_func(self, func): assert QThread.currentThreadId() == self.main_thread_id, \ ("Running in %s, not %s" % (str(QThread.currentThreadId()), str(self.main_thread_id))) func() def idle_add(self, func, *args): def doit(): try: func(*args) except Exception, e: logger.exception("Running %s%s: %s", func, str(tuple(args)), str(e)) if QThread.currentThreadId() == self.main_thread_id: # If we emit the signal in the main thread, # then the function will be run immediately. # Instead, use a single shot timer with a 0 # timeout: this will run the function when the # event loop next iterates. QTimer.singleShot(0, doit) else: self.signal.emit(doit) global idle_add_handler if idle_add_handler is None: idle_add_handler = IdleAddHandler() idle_add_handler.idle_add(func, *args) else: func(*args) def bluetooth_available(): """ Returns True or False depending on the availability of bluetooth functionality on the system. """ if find_command('bluetooth-sendto') or \ find_command('gnome-obex-send'): return True else: return False def bluetooth_send_file(filename): """ Sends a file via bluetooth. This function tries to use "bluetooth-sendto", and if it is not available, it also tries "gnome-obex-send". """ command_line = None if find_command('bluetooth-sendto'): command_line = ['bluetooth-sendto'] elif find_command('gnome-obex-send'): command_line = ['gnome-obex-send'] if command_line is not None: command_line.append(filename) return (subprocess.Popen(command_line).wait() == 0) else: logger.error('Cannot send file. Please install "bluetooth-sendto" or "gnome-obex-send".') return False def format_time(value): """Format a seconds value to a string >>> format_time(0) '00:00' >>> format_time(20) '00:20' >>> format_time(3600) '01:00:00' >>> format_time(10921) '03:02:01' """ dt = datetime.datetime.utcfromtimestamp(value) if dt.hour == 0: return dt.strftime('%M:%S') else: return dt.strftime('%H:%M:%S') def parse_time(value): """Parse a time string into seconds >>> parse_time('00:00') 0 >>> parse_time('00:00:00') 0 >>> parse_time('00:20') 20 >>> parse_time('00:00:20') 20 >>> parse_time('01:00:00') 3600 >>> parse_time('03:02:01') 10921 >>> parse_time('61:08') 3668 >>> parse_time('25:03:30') 90210 >>> parse_time('25:3:30') 90210 >>> parse_time('61.08') 3668 """ if value == '': return 0 if not value: raise ValueError('Invalid value: %s' % (str(value),)) m = re.match(r'(\d+)[:.](\d\d?)[:.](\d\d?)', value) if m: hours, minutes, seconds = m.groups() return (int(hours) * 60 + int(minutes)) * 60 + int(seconds) m = re.match(r'(\d+)[:.](\d\d?)', value) if m: minutes, seconds = m.groups() return int(minutes) * 60 + int(seconds) return int(value) def format_seconds_to_hour_min_sec(seconds): """ Take the number of seconds and format it into a human-readable string (duration). >>> format_seconds_to_hour_min_sec(3834) u'1 hour, 3 minutes and 54 seconds' >>> format_seconds_to_hour_min_sec(3600) u'1 hour' >>> format_seconds_to_hour_min_sec(62) u'1 minute and 2 seconds' """ if seconds < 1: return N_('%(count)d second', '%(count)d seconds', seconds) % {'count':seconds} result = [] seconds = int(seconds) hours = seconds/3600 seconds = seconds%3600 minutes = seconds/60 seconds = seconds%60 if hours: result.append(N_('%(count)d hour', '%(count)d hours', hours) % {'count':hours}) if minutes: result.append(N_('%(count)d minute', '%(count)d minutes', minutes) % {'count':minutes}) if seconds: result.append(N_('%(count)d second', '%(count)d seconds', seconds) % {'count':seconds}) if len(result) > 1: return (' '+_('and')+' ').join((', '.join(result[:-1]), result[-1])) else: return result[0] def http_request(url, method='HEAD'): (scheme, netloc, path, parms, qry, fragid) = urlparse.urlparse(url) conn = httplib.HTTPConnection(netloc) start = len(scheme) + len('://') + len(netloc) conn.request(method, url[start:]) return conn.getresponse() def gui_open(filename): """ Open a file or folder with the default application set by the Desktop environment. This uses "xdg-open" on all systems with a few exceptions: on Win32, os.startfile() is used """ try: if gpodder.ui.win32: os.startfile(filename) elif gpodder.ui.osx: subprocess.Popen(['open', filename]) else: subprocess.Popen(['xdg-open', filename]) return True except: logger.error('Cannot open file/folder: "%s"', filename, exc_info=True) return False def open_website(url): """ Opens the specified URL using the default system web browser. This uses Python's "webbrowser" module, so make sure your system is set up correctly. """ run_in_background(lambda: webbrowser.open(url)) def convert_bytes(d): """ Convert byte strings to unicode strings This function will decode byte strings into unicode strings. Any other data types will be left alone. >>> convert_bytes(None) >>> convert_bytes(1) 1 >>> convert_bytes(4711L) 4711L >>> convert_bytes(True) True >>> convert_bytes(3.1415) 3.1415 >>> convert_bytes('Hello') u'Hello' >>> convert_bytes(u'Hey') u'Hey' """ if d is None: return d if any(isinstance(d, t) for t in (int, long, bool, float)): return d elif not isinstance(d, unicode): return d.decode('utf-8', 'ignore') return d def sanitize_encoding(filename): r""" Generate a sanitized version of a string (i.e. remove invalid characters and encode in the detected native language encoding). >>> sanitize_encoding('\x80') '' >>> sanitize_encoding(u'unicode') 'unicode' """ # The encoding problem goes away in Python 3.. hopefully! if sys.version_info >= (3, 0): return filename global encoding if not isinstance(filename, unicode): filename = filename.decode(encoding, 'ignore') return filename.encode(encoding, 'ignore') def sanitize_filename(filename, max_length=0, use_ascii=False): """ Generate a sanitized version of a filename that can be written on disk (i.e. remove/replace invalid characters and encode in the native language) and trim filename if greater than max_length (0 = no limit). If use_ascii is True, don't encode in the native language, but use only characters from the ASCII character set. """ if not isinstance(filename, unicode): filename = filename.decode(encoding, 'ignore') if max_length > 0 and len(filename) > max_length: logger.info('Limiting file/folder name "%s" to %d characters.', filename, max_length) filename = filename[:max_length] filename = filename.encode('ascii' if use_ascii else encoding, 'ignore') filename = filename.translate(SANITIZATION_TABLE) filename = filename.strip('.' + string.whitespace) return filename def find_mount_point(directory): """ Try to find the mount point for a given directory. If the directory is itself a mount point, return it. If not, remove the last part of the path and re-check if it's a mount point. If the directory resides on your root filesystem, "/" is returned. >>> find_mount_point('/') '/' >>> find_mount_point(u'/something') Traceback (most recent call last): ... ValueError: Convert unicode objects to str first. >>> find_mount_point(None) Traceback (most recent call last): ... ValueError: Directory names should be of type str. >>> find_mount_point(42) Traceback (most recent call last): ... ValueError: Directory names should be of type str. >>> from minimock import mock, restore >>> mocked_mntpoints = ('/', '/home', '/media/usbdisk', '/media/cdrom') >>> mock('os.path.ismount', returns_func=lambda x: x in mocked_mntpoints) >>> >>> # For mocking os.getcwd(), we simply use a lambda to avoid the >>> # massive output of "Called os.getcwd()" lines in this doctest >>> os.getcwd = lambda: '/home/thp' >>> >>> find_mount_point('.') Called os.path.ismount('/home/thp') Called os.path.ismount('/home') '/home' >>> find_mount_point('relativity') Called os.path.ismount('/home/thp/relativity') Called os.path.ismount('/home/thp') Called os.path.ismount('/home') '/home' >>> find_mount_point('/media/usbdisk/') Called os.path.ismount('/media/usbdisk') '/media/usbdisk' >>> find_mount_point('/home/thp/Desktop') Called os.path.ismount('/home/thp/Desktop') Called os.path.ismount('/home/thp') Called os.path.ismount('/home') '/home' >>> find_mount_point('/media/usbdisk/Podcasts/With Spaces') Called os.path.ismount('/media/usbdisk/Podcasts/With Spaces') Called os.path.ismount('/media/usbdisk/Podcasts') Called os.path.ismount('/media/usbdisk') '/media/usbdisk' >>> find_mount_point('/home/') Called os.path.ismount('/home') '/home' >>> find_mount_point('/media/cdrom/../usbdisk/blubb//') Called os.path.ismount('/media/usbdisk/blubb') Called os.path.ismount('/media/usbdisk') '/media/usbdisk' >>> restore() """ if isinstance(directory, unicode): # XXX: This is only valid for Python 2 - misleading error in Python 3? # We do not accept unicode strings, because they could fail when # trying to be converted to some native encoding, so fail loudly # and leave it up to the callee to encode into the proper encoding. raise ValueError('Convert unicode objects to str first.') if not isinstance(directory, str): # In Python 2, we assume it's a byte str; in Python 3, we assume # that it's a unicode str. The abspath/ismount/split functions of # os.path work with unicode str in Python 3, but not in Python 2. raise ValueError('Directory names should be of type str.') directory = os.path.abspath(directory) while directory != '/': if os.path.ismount(directory): return directory else: (directory, tail_data) = os.path.split(directory) return '/' # matches http:// and ftp:// and mailto:// protocolPattern = re.compile(r'^\w+://') def isabs(string): """ @return true if string is an absolute path or protocoladdress for addresses beginning in http:// or ftp:// or ldap:// - they are considered "absolute" paths. Source: http://code.activestate.com/recipes/208993/ """ if protocolPattern.match(string): return 1 return os.path.isabs(string) def commonpath(l1, l2, common=[]): """ helper functions for relpath Source: http://code.activestate.com/recipes/208993/ """ if len(l1) < 1: return (common, l1, l2) if len(l2) < 1: return (common, l1, l2) if l1[0] != l2[0]: return (common, l1, l2) return commonpath(l1[1:], l2[1:], common+[l1[0]]) def relpath(p1, p2): """ Finds relative path from p1 to p2 Source: http://code.activestate.com/recipes/208993/ """ pathsplit = lambda s: s.split(os.path.sep) (common,l1,l2) = commonpath(pathsplit(p1), pathsplit(p2)) p = [] if len(l1) > 0: p = [ ('..'+os.sep) * len(l1) ] p = p + l2 if len(p) is 0: return "." return os.path.join(*p) def get_hostname(): """Return the hostname of this computer This can be implemented in a different way on each platform and should yield a unique-per-user device ID. """ nodename = platform.node() if nodename: return nodename # Fallback - but can this give us "localhost"? return socket.gethostname() def detect_device_type(): """Device type detection for gpodder.net This function tries to detect on which kind of device gPodder is running on. Possible return values: desktop, laptop, mobile, server, other """ if gpodder.ui.harmattan or gpodder.ui.sailfish: return 'mobile' elif glob.glob('/proc/acpi/battery/*'): # Linux: If we have a battery, assume Laptop return 'laptop' return 'desktop' def write_m3u_playlist(m3u_filename, episodes, extm3u=True): """Create an M3U playlist from a episode list If the parameter "extm3u" is False, the list of episodes should be a list of filenames, and no extended information will be written into the M3U files (#EXTM3U / #EXTINF). If the parameter "extm3u" is True (default), then the list of episodes should be PodcastEpisode objects, as the extended metadata will be taken from them. """ f = open(m3u_filename, 'w') if extm3u: # Mandatory header for extended playlists f.write('#EXTM3U\n') for episode in episodes: if not extm3u: # Episode objects are strings that contain file names f.write(episode+'\n') continue if episode.was_downloaded(and_exists=True): filename = episode.local_filename(create=False) assert filename is not None if os.path.dirname(filename).startswith(os.path.dirname(m3u_filename)): filename = filename[len(os.path.dirname(m3u_filename)+os.sep):] f.write('#EXTINF:0,'+episode.playlist_title()+'\n') f.write(filename+'\n') f.close() def generate_names(filename): basename, ext = os.path.splitext(filename) for i in itertools.count(): if i: yield '%s (%d)%s' % (basename, i+1, ext) else: yield filename def is_known_redirecter(url): """Check if a URL redirect is expected, and no filenames should be updated We usually honor URL redirects, and update filenames accordingly. In some cases (e.g. Soundcloud) this results in a worse filename, so we hardcode and detect these cases here to avoid renaming files for which we know that a "known good default" exists. The problem here is that by comparing the currently-assigned filename with the new filename determined by the URL, we cannot really determine which one is the "better" URL (e.g. "n5rMSpXrqmR9.128.mp3" for Soundcloud). """ # Soundcloud-hosted media downloads (we take the track name as filename) if url.startswith('http://ak-media.soundcloud.com/'): return True return False def atomic_rename(old_name, new_name): """Atomically rename/move a (temporary) file This is usually used when updating a file safely by writing the new contents into a temporary file and then moving the temporary file over the original file to replace it. """ if gpodder.ui.win32: # Win32 does not support atomic rename with os.rename shutil.move(old_name, new_name) else: os.rename(old_name, new_name) def check_command(self, cmd): """Check if a command line command/program exists""" # Prior to Python 2.7.3, this module (shlex) did not support Unicode input. cmd = sanitize_encoding(cmd) program = shlex.split(cmd)[0] return (find_command(program) is not None) def rename_episode_file(episode, filename): """Helper method to update a PodcastEpisode object Useful after renaming/converting its download file. """ if not os.path.exists(filename): raise ValueError('Target filename does not exist.') basename, extension = os.path.splitext(filename) episode.download_filename = os.path.basename(filename) episode.file_size = os.path.getsize(filename) episode.mime_type = mimetype_from_extension(extension) episode.save() episode.db.commit() def get_update_info(url='http://gpodder.org/downloads'): """ Get up to date release information from gpodder.org. Returns a tuple: (up_to_date, latest_version, release_date, days_since) Example result (up to date version, 20 days after release): (True, '3.0.4', '2012-01-24', 20) Example result (outdated version, 10 days after release): (False, '3.0.5', '2012-02-29', 10) """ data = urlopen(url).read() id_field_re = re.compile(r'<([a-z]*)[^>]*id="([^"]*)"[^>]*>([^<]*)') info = dict((m.group(2), m.group(3)) for m in id_field_re.finditer(data)) latest_version = info['latest-version'] release_date = info['release-date'] release_parsed = datetime.datetime.strptime(release_date, '%Y-%m-%d') days_since_release = (datetime.datetime.today() - release_parsed).days convert = lambda s: tuple(int(x) for x in s.split('.')) up_to_date = (convert(gpodder.__version__) >= convert(latest_version)) return up_to_date, latest_version, release_date, days_since_release def run_in_background(function, daemon=False): logger.debug('run_in_background: %s (%s)', function, str(daemon)) thread = threading.Thread(target=function) thread.setDaemon(daemon) thread.start() return thread def linux_get_active_interfaces(): """Get active network interfaces using 'ip link' Returns a list of active network interfaces or an empty list if the device is offline. The loopback interface is not included. """ process = subprocess.Popen(['ip', 'link'], stdout=subprocess.PIPE) data, _ = process.communicate() for interface, _ in re.findall(r'\d+: ([^:]+):.*state (UP|UNKNOWN)', data): if interface != 'lo': yield interface def osx_get_active_interfaces(): """Get active network interfaces using 'ifconfig' Returns a list of active network interfaces or an empty list if the device is offline. The loopback interface is not included. """ process = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE) stdout, _ = process.communicate() for i in re.split('\n(?!\t)', stdout, re.MULTILINE): b = re.match('(\\w+):.*status: active$', i, re.MULTILINE | re.DOTALL) if b: yield b.group(1) def unix_get_active_interfaces(): """Get active network interfaces using 'ifconfig' Returns a list of active network interfaces or an empty list if the device is offline. The loopback interface is not included. """ process = subprocess.Popen(['ifconfig'], stdout=subprocess.PIPE) stdout, _ = process.communicate() for i in re.split('\n(?!\t)', stdout, re.MULTILINE): b = re.match('(\\w+):.*status: active$', i, re.MULTILINE | re.DOTALL) if b: yield b.group(1) def connection_available(): """Check if an Internet connection is available Returns True if a connection is available (or if there is no way to determine the connection). Returns False if no network interfaces are up (i.e. no connectivity). """ try: if gpodder.ui.win32: # FIXME: Implement for Windows return True elif gpodder.ui.osx: return len(list(osx_get_active_interfaces())) > 0 else: # By default, we assume we're not offline (bug 1730) offline = False if find_command('ifconfig') is not None: # If ifconfig is available, and it says we don't have # any active interfaces, assume we're offline if len(list(unix_get_active_interfaces())) == 0: offline = True # If we assume we're offline, try the "ip" command as fallback if offline and find_command('ip') is not None: if len(list(linux_get_active_interfaces())) == 0: offline = True else: offline = False return not offline return False except Exception, e: logger.warn('Cannot get connection status: %s', e, exc_info=True) # When we can't determine the connection status, act as if we're online (bug 1730) return True def website_reachable(url): """ Check if a specific website is available. """ if not connection_available(): # No network interfaces up - assume website not reachable return (False, None) try: response = urllib2.urlopen(url, timeout=1) return (True, response) except urllib2.URLError as err: pass return (False, None) gpodder-3.5.2/src/gpodder/vimeo.py0000644000175000017500000000475712220076757016506 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # gpodder.vimeo - Vimeo download magic # Thomas Perl ; 2012-01-03 # import gpodder from gpodder import util import logging logger = logging.getLogger(__name__) import re VIMEOCOM_RE = re.compile(r'http://vimeo\.com/(\d+)$', re.IGNORECASE) MOOGALOOP_RE = re.compile(r'http://vimeo\.com/moogaloop\.swf\?clip_id=(\d+)$', re.IGNORECASE) SIGNATURE_RE = re.compile(r'"timestamp":(\d+),"signature":"([^"]+)"') class VimeoError(BaseException): pass def get_real_download_url(url): quality = 'sd' codecs = 'H264,VP8,VP6' video_id = get_vimeo_id(url) if video_id is None: return url web_url = 'http://vimeo.com/%s' % video_id web_data = util.urlopen(web_url).read() sig_pair = SIGNATURE_RE.search(web_data) if sig_pair is None: raise VimeoError('Cannot get signature pair from Vimeo') timestamp, signature = sig_pair.groups() params = '&'.join('%s=%s' % i for i in [ ('clip_id', video_id), ('sig', signature), ('time', timestamp), ('quality', quality), ('codecs', codecs), ('type', 'moogaloop_local'), ('embed_location', ''), ]) player_url = 'http://player.vimeo.com/play_redirect?%s' % params return player_url def get_vimeo_id(url): result = MOOGALOOP_RE.match(url) if result is not None: return result.group(1) result = VIMEOCOM_RE.match(url) if result is not None: return result.group(1) return None def is_video_link(url): return (get_vimeo_id(url) is not None) def get_real_channel_url(url): result = VIMEOCOM_RE.match(url) if result is not None: return 'http://vimeo.com/%s/videos/rss' % result.group(1) return url def get_real_cover(url): return None gpodder-3.5.2/src/gpodder/youtube.py0000644000175000017500000002111312220076757017044 0ustar thpthp00000000000000# -*- coding: utf-8 -*- # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # gpodder.youtube - YouTube and related magic # Justin Forest 2008-10-13 # import gpodder from gpodder import util import os.path import logging logger = logging.getLogger(__name__) try: import simplejson as json except ImportError: import json import re import urllib try: # Python >= 2.6 from urlparse import parse_qs except ImportError: # Python < 2.6 from cgi import parse_qs # http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs # format id, (preferred ids, path(?), description) # video bitrate, audio bitrate formats = [ # WebM VP8 video, Vorbis audio # Fallback to an MP4 version of same quality. # Try 34 (FLV 360p H.264 AAC) if 18 (MP4 360p) fails. # Fallback to 6 or 5 (FLV Sorenson H.263 MP3) if all fails. (46, ([46, 37, 45, 22, 44, 35, 43, 18, 6, 34, 5], '45/1280x720/99/0/0', 'WebM 1080p (1920x1080)')), # N/A, 192 kbps (45, ([45, 22, 44, 35, 43, 18, 6, 34, 5], '45/1280x720/99/0/0', 'WebM 720p (1280x720)')), # 2.0 Mbps, 192 kbps (44, ([44, 35, 43, 18, 6, 34, 5], '44/854x480/99/0/0', 'WebM 480p (854x480)')), # 1.0 Mbps, 128 kbps (43, ([43, 18, 6, 34, 5], '43/640x360/99/0/0', 'WebM 360p (640x360)')), # 0.5 Mbps, 128 kbps # MP4 H.264 video, AAC audio # Try 35 (FLV 480p H.264 AAC) between 720p and 360p because there's no MP4 480p. # Try 34 (FLV 360p H.264 AAC) if 18 (MP4 360p) fails. # Fallback to 6 or 5 (FLV Sorenson H.263 MP3) if all fails. (38, ([38, 37, 22, 35, 18, 34, 6, 5], '38/1920x1080/9/0/115', 'MP4 4K 3072p (4096x3072)')), # 5.0 - 3.5 Mbps, 192 kbps (37, ([37, 22, 35, 18, 34, 6, 5], '37/1920x1080/9/0/115', 'MP4 HD 1080p (1920x1080)')), # 4.3 - 3.0 Mbps, 192 kbps (22, ([22, 35, 18, 34, 6, 5], '22/1280x720/9/0/115', 'MP4 HD 720p (1280x720)')), # 2.9 - 2.0 Mbps, 192 kbps (18, ([18, 34, 6, 5], '18/640x360/9/0/115', 'MP4 360p (640x360)')), # 0.5 Mbps, 96 kbps # FLV H.264 video, AAC audio # Does not check for 360p MP4. # Fallback to 6 or 5 (FLV Sorenson H.263 MP3) if all fails. (35, ([35, 34, 6, 5], '35/854x480/9/0/115', 'FLV 480p (854x480)')), # 1 - 0.80 Mbps, 128 kbps (34, ([34, 6, 5], '34/640x360/9/0/115', 'FLV 360p (640x360)')), # 0.50 Mbps, 128 kbps # FLV Sorenson H.263 video, MP3 audio (6, ([6, 5], '5/480x270/7/0/0', 'FLV 270p (480x270)')), # 0.80 Mbps, 64 kbps (5, ([5], '5/320x240/7/0/0', 'FLV 240p (320x240)')), # 0.25 Mbps, 64 kbps ] formats_dict = dict(formats) class YouTubeError(Exception): pass def get_fmt_ids(youtube_config): fmt_ids = youtube_config.preferred_fmt_ids if not fmt_ids: format = formats_dict.get(youtube_config.preferred_fmt_id) if format is None: fmt_ids = [] else: fmt_ids, path, description = format return fmt_ids def get_real_download_url(url, preferred_fmt_ids=None): if not preferred_fmt_ids: preferred_fmt_ids, _, _ = formats_dict[22] # MP4 720p vid = get_youtube_id(url) if vid is not None: page = None url = 'http://www.youtube.com/get_video_info?&el=detailpage&video_id=' + vid while page is None: req = util.http_request(url, method='GET') if 'location' in req.msg: url = req.msg['location'] else: page = req.read() # Try to find the best video format available for this video # (http://forum.videohelp.com/topic336882-1800.html#1912972) def find_urls(page): r4 = re.search('.*&url_encoded_fmt_stream_map=([^&]+)&.*', page) if r4 is not None: fmt_url_map = urllib.unquote(r4.group(1)) for fmt_url_encoded in fmt_url_map.split(','): video_info = parse_qs(fmt_url_encoded) yield int(video_info['itag'][0]), video_info['url'][0] + "&signature=" + video_info['sig'][0] else: error_info = parse_qs(page) error_message = util.remove_html_tags(error_info['reason'][0]) raise YouTubeError('Cannot download video: %s' % error_message) fmt_id_url_map = sorted(find_urls(page), reverse=True) if not fmt_id_url_map: raise YouTubeError('fmt_url_map not found for video ID "%s"' % vid) # Default to the highest fmt_id if we don't find a match below _, url = fmt_id_url_map[0] formats_available = set(fmt_id for fmt_id, url in fmt_id_url_map) fmt_id_url_map = dict(fmt_id_url_map) # This provides good quality video, seems to be always available # and is playable fluently in Media Player if gpodder.ui.harmattan or gpodder.ui.sailfish: preferred_fmt_ids = [18] for id in preferred_fmt_ids: id = int(id) if id in formats_available: format = formats_dict.get(id) if format is not None: _, _, description = format else: description = 'Unknown' logger.info('Found YouTube format: %s (fmt_id=%d)', description, id) url = fmt_id_url_map[id] break return url def get_youtube_id(url): r = re.compile('http[s]?://(?:[a-z]+\.)?youtube\.com/v/(.*)\.swf', re.IGNORECASE).match(url) if r is not None: return r.group(1) r = re.compile('http[s]?://(?:[a-z]+\.)?youtube\.com/watch\?v=([^&]*)', re.IGNORECASE).match(url) if r is not None: return r.group(1) r = re.compile('http[s]?://(?:[a-z]+\.)?youtube\.com/v/(.*)[?]', re.IGNORECASE).match(url) if r is not None: return r.group(1) return None def is_video_link(url): return (get_youtube_id(url) is not None) def is_youtube_guid(guid): return guid.startswith('tag:youtube.com,2008:video:') def get_real_channel_url(url): r = re.compile('http://(?:[a-z]+\.)?youtube\.com/user/([a-z0-9]+)', re.IGNORECASE) m = r.match(url) if m is not None: next = 'http://www.youtube.com/rss/user/'+ m.group(1) +'/videos.rss' logger.debug('YouTube link resolved: %s => %s', url, next) return next r = re.compile('http://(?:[a-z]+\.)?youtube\.com/profile?user=([a-z0-9]+)', re.IGNORECASE) m = r.match(url) if m is not None: next = 'http://www.youtube.com/rss/user/'+ m.group(1) +'/videos.rss' logger.debug('YouTube link resolved: %s => %s', url, next) return next return url def get_real_cover(url): r = re.compile('http://www\.youtube\.com/rss/user/([^/]+)/videos\.rss', \ re.IGNORECASE) m = r.match(url) if m is not None: username = m.group(1) api_url = 'http://gdata.youtube.com/feeds/api/users/%s?v=2' % username data = util.urlopen(api_url).read() match = re.search('', data) if match is not None: logger.debug('YouTube userpic for %s is: %s', url, match.group(1)) return match.group(1) return None def find_youtube_channels(string): url = 'http://gdata.youtube.com/feeds/api/videos?alt=json&q=%s' % urllib.quote(string, '') data = json.load(util.urlopen(url)) class FakeImporter(object): def __init__(self): self.items = [] result = FakeImporter() seen_users = set() for entry in data['feed']['entry']: user = os.path.basename(entry['author'][0]['uri']['$t']) title = entry['title']['$t'] url = 'http://www.youtube.com/rss/user/%s/videos.rss' % user if user not in seen_users: result.items.append({ 'title': user, 'url': url, 'description': title }) seen_users.add(user) return result gpodder-3.5.2/tools/0000755000175000017500000000000012220346122013707 5ustar thpthp00000000000000gpodder-3.5.2/tools/draft/0000755000175000017500000000000012220346122015007 5ustar thpthp00000000000000gpodder-3.5.2/tools/draft/directory-ui/0000755000175000017500000000000012220346122017426 5ustar thpthp00000000000000gpodder-3.5.2/tools/draft/directory-ui/directory.py0000644000175000017500000001246212220076757022027 0ustar thpthp00000000000000 import gtk import gobject import pango import tagcloud import json w = gtk.Dialog() w.set_title('Discover new podcasts') w.set_default_size(650, 450) tv = gtk.TreeView() tv.set_headers_visible(False) tv.set_size_request(160, -1) class OpmlEdit(object): pass class Search(object): pass class OpmlFixed(object): pass class TagCloud(object): pass search_providers = ( ('gpodder.net', 'search_gpodder.png', Search), ('YouTube', 'search_youtube.png', Search), ('SoundCloud', 'search_soundcloud.png', Search), ('Miro Guide', 'search_miro.png', Search), ) directory_providers = ( ('Toplist', 'directory_toplist.png', OpmlFixed), ('Examples', 'directory_example.png', OpmlFixed), ('Tag cloud', 'directory_tags.png', TagCloud), ) SEPARATOR = (True, pango.WEIGHT_NORMAL, '', None, None) C_SEPARATOR, C_WEIGHT, C_TEXT, C_ICON, C_PROVIDER = range(5) store = gtk.ListStore(bool, int, str, gtk.gdk.Pixbuf, object) opml_pixbuf = gtk.gdk.pixbuf_new_from_file('directory_opml.png') store.append((False, pango.WEIGHT_NORMAL, 'OPML', opml_pixbuf, OpmlEdit)) store.append(SEPARATOR) for name, icon, provider in search_providers: pixbuf = gtk.gdk.pixbuf_new_from_file(icon) store.append((False, pango.WEIGHT_NORMAL, name, pixbuf, provider)) store.append(SEPARATOR) for name, icon, provider in directory_providers: pixbuf = gtk.gdk.pixbuf_new_from_file(icon) store.append((False, pango.WEIGHT_NORMAL, name, pixbuf, provider)) store.append(SEPARATOR) for i in range(1, 5): store.append((False, pango.WEIGHT_NORMAL, 'Bookmark %d' % i, None, None)) tv.set_model(store) def is_row_separator(model, iter): return model.get_value(iter, C_SEPARATOR) tv.set_row_separator_func(is_row_separator) column = gtk.TreeViewColumn('') cell = gtk.CellRendererPixbuf() column.pack_start(cell, False) column.add_attribute(cell, 'pixbuf', C_ICON) cell = gtk.CellRendererText() column.pack_start(cell) column.add_attribute(cell, 'text', C_TEXT) column.add_attribute(cell, 'weight', C_WEIGHT) tv.append_column(column) def on_row_activated(treeview, path, column): model = treeview.get_model() iter = model.get_iter(path) for row in model: row[C_WEIGHT] = pango.WEIGHT_NORMAL if iter: model.set_value(iter, C_WEIGHT, pango.WEIGHT_BOLD) provider = model.get_value(iter, C_PROVIDER) use_provider(provider) def on_cursor_changed(treeview): path, column = treeview.get_cursor() on_row_activated(treeview, path, column) tv.connect('row-activated', on_row_activated) tv.connect('cursor-changed', on_cursor_changed) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_IN) sw.add(tv) sidebar = gtk.VBox() sidebar.set_spacing(6) sidebar.pack_start(sw, True, True) sidebar.pack_start(gtk.Button('Add bookmark'), False, False) vb = gtk.VBox() vb.set_spacing(6) title_label = gtk.Label('Title') title_label.set_alignment(0, 0) vb.pack_start(title_label, False, False) search_hbox = gtk.HBox() search_hbox.set_spacing(6) search_label = gtk.Label('') search_hbox.pack_start(search_label, False, False) search_entry = gtk.Entry() search_hbox.pack_start(search_entry, True, True) search_button = gtk.Button('') search_hbox.pack_start(search_button, False, False) vb.pack_start(search_hbox, False, False) tagcloud_sw = gtk.ScrolledWindow() tagcloud_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) tagcloud_sw.set_shadow_type(gtk.SHADOW_IN) podcast_tags = json.loads(""" [ {"tag": "Technology", "usage": 530 }, {"tag": "Society & Culture", "usage": 420 }, {"tag": "Arts", "usage": 400}, {"tag": "News & Politics", "usage": 320} ] """) tagcloudw = tagcloud.TagCloud(list((x['tag'], x['usage']) for x in podcast_tags), 10, 14) tagcloud_sw.set_size_request(-1, 130) tagcloud_sw.add(tagcloudw) vb.pack_start(tagcloud_sw, False, False) podcasts_sw = gtk.ScrolledWindow() podcasts_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) podcasts_sw.set_shadow_type(gtk.SHADOW_IN) podcasts_tv = gtk.TreeView() podcasts_sw.add(podcasts_tv) vb.pack_start(podcasts_sw, True, True) hb = gtk.HBox() hb.set_spacing(12) hb.set_border_width(12) hb.pack_start(sidebar, False, True) hb.pack_start(vb, True, True) w.vbox.add(hb) w.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) w.add_button('Subscribe', gtk.RESPONSE_OK) w.set_response_sensitive(gtk.RESPONSE_OK, False) def use_provider(provider): if provider == OpmlEdit: search_label.set_text('URL:') search_button.set_label('Download') else: search_label.set_text('Search:') search_button.set_label('Search') if provider in (OpmlEdit, Search): title_label.hide() search_hbox.show() search_entry.set_text('') def later(): search_entry.grab_focus() return False gobject.idle_add(later) elif provider == TagCloud: title_label.hide() search_hbox.hide() else: if provider == OpmlFixed: title_label.set_text('Example stuff') elif provider == TagCloud: title_label.set_text('Tag cloud') title_label.show() search_hbox.hide() tagcloud_sw.set_visible(provider == TagCloud) print 'using provider:', provider #w.connect('destroy', gtk.main_quit) w.show_all() on_row_activated(tv, (0,), None) w.run() #gtk.main() gpodder-3.5.2/tools/draft/directory-ui/directory_example.png0000644000175000017500000000162412220076757023674 0ustar thpthp00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDAT8}]L[@|:0Ó_ك. &}11ΨaO5 Ag` 2VK--M>Dm^ ttv8Ҡr1,/>ܰH&2>$9󜢪>RA67HLo-heI͢HttvɘmKˎ`m6RׯoeeeNǩ>m[7oޠXGT^xw k,--kU6qN ?n2ʘU˷45bk$&pʎ;o,}7uuI{o/e L>M4'b6m[xu \.DdؕM3kx;T*Yq}|PBUT`>e?{3G%9)0&gRQվ<ɶe1%~?8N?Z0OWƯvi0000 K(KwH:v(bY{sEn,̻n՝ĆsalC7t!Cc!V@HU&2/.7IENDB`gpodder-3.5.2/tools/draft/directory-ui/directory_opml.png0000644000175000017500000007652712220076757023226 0ustar thpthp00000000000000PNG  IHDRasBIT|d pHYs  ~tEXtCreation Time08/17/06d;tEXtSoftwareMacromedia Fireworks 8hx+prVWx}leǟkDcT!@y h1dQcmu0p^D1!$#aFT8B$M\o.ʥnvӵ===< $%0~гC^?aBN57$^Dr⓳sr6>4~nl/*5pxq 0SlnPE?Gi~^3hM~9&W>,` ʑ,x?R V`X B,WH9TT5īTr4TЯVܝgd[2Gj~o O.r:&wrC{=5X,#UBz;_P(/p) y /S(A؄y_7*wuUutQXEo?7?Nz7ܟq6Пqp=ф{t 3VϸLûGI!wy947q5Wk@û2,dZۧthm?;,VqYZۧ#Ol8p$ ,"v Aի9~6O{Oןu\$V\}lwڔXkt1AOw96KimϦ.܃Mk荗y~ivw/:@FoOpn|]dB]hB]l4?.6ПqMϸ&O]`B]5oI:ϙ~o?f3 xLmm`#cb=` (3`?տbjuϸgݙ@ _C_pON.u:k@5`-H9{ŕ`(@ X bB^,.  w\6oU/Pmw;}iV ̝)!_U-ݡ~&&j >%'TԼO(%?+,WR&߽WDk_/֩m5!_5"5C]nX3ce 5)UKPVUl5)WniJ)'dHmkBF)3)>mkTSx}isF6vv<6%Y/؈pUf&mGwtxEJ/U @ D7 ̧2 7+E$tuvrWg WN8/"Oϡx{jXҿ~l\\98Sgl;9wfgGp  [gl:PYF)VuDuoϯE?;WۇW 8j{K8>}>os$+ ];ئoODቨd,9ó-]v̱GpaeglF; g~]oT{ƀҹZ5a?9:&t=m>omz!DbcO |q5|<#4q!_ Tc0‰c1N4oN<^hdOg J:k`̧PspMί E)_7Λ`2i̳}f1H ˉK/Kcޠ. 7PKޒ k N* ?[K +03TTz"BTpB6EHnne@GP:%}VXrzvٟ$F\pYNdtV ~ۂ|h gh͛HZѽċY)bG*̛sg{y0@T!%Kb\3'@f&$qDƩ7&ܒ"+è1ExiΨ 'H㻐 ތ'M<\b!03'qIkon{p;LRn#g_i.m-s6cPPb Z@+,?L)3oǙ2q^#@\4E(Eb0#_c4@"DR*^(5/g0l'`頒ߛXVyjIƌ&ȑ:ӈ^=d/tRbmYb-U(}^R{SpכCʼnN'`Vqn 7\abx%3e&W@ h\+q-yZBr5\:2 B@(eS&z}+ % @&iR0ܤez צs(?-6Xׁ 4olr厃tgcU,PY>%^D b+;)mIY7Rc$]͈On;{R< V436+HZWVH&ݚ~}IBO2Ikn]s\2;0 ,QOc\2=s0V]MnNh&-P(MBKfaIx,bt(`# Cxtb-_(b7{OHl1)MY@5K3KPgȯeHL5&5Y,I`gQA3pQ}HLÑIG49.D&~on_Z+ A"ё("M8L>o Kʩf ']N7[_'0CgV[7ǖYLeyYnǰߨ%ZMS2{$T_~S8Md@  @#I;͖F8C5|*+ssv-I_'o}^5tE&k2[pQȰvf1Y1K_W3T扅c)_qnAKhi:]eq¾3{7n37@NqQLTS w,$頱a1eq]jcteR$5|rѱ2mb61cE#H 隑ǔ^ٚYv7IPR m&U!(r5 )_ye%NA%n CPp°TKƫIP'L.Ր|AKN,W25I.wM|[j/ghKx x!k0L1(H48 ѩש5ׄafOba:Df# E’t|;S5s#;^ bM8!rzm}3[]X'q>fHN֑RR}63E 6%fNKCHtvJLTw`JUYS5MO$o-y&tGT$a6qI.x_Mpzq9Gt{(ܬta22dw ٓ̃yA1(l7a ۮ90U,VSG.O]\ٜhPBx}գ:äԛN&kĥʗz4l1W7a}04;}C ?\`a'WI/v-KgCc﬜A3/sI/Fc uFfi9P/X7!n<>"yqdJk3.u>U%q6)SCJ 6x5ѯ[`l1 QblHM>t". 3C wiI/R Ҋ׌v^207siN'Q*[.e] oRmE.iz2G:Kxm(%3IZRY_ 7 ,I,cJȝ+H$#ZxE:,@.i`ԧKF#Q/gxX (NtH#6KjieI.q%8e=3#R/%grN}3#`[hGT > ,"`s,s_kYEZꆫ|rhF*% yܚh1o!ʮ9D'BNM$(D\ @_Fk:AZv|!9\[$maלZ\s-veiՄ.e?=Zq!Vi ɉ)ZFz|;iEBZQ'6" T*ӊ iŝHS)]NTS)+Nkh'D2dDKYnbEĺ6:l;9̈́fi# Vf@y^Nfs!y'6w_sQIk!&\(ղ5e$[j{™:} ZKS1OkuL/LAt7OkNjm3#ڢG;mZ:WU+U?^k_#}FS"ר&݁ Ѧfm(-s&jw8~_P,mL<+;UijX^3{ݹr"* ?Ý '<7wp.~2 JJku#s3lWrwlҥB^v楷W{"'0مZ{,iOl~DW^}vzDUכ-oj7MhH?4L*{77/3ZH3Cڔy)_|N>Uz3?i:cݧl/2V0/ܿʏ, ,)__R1kxL5 +wwq9Nv{O^Ԉ1/ Ao(06IgLwY_O+VjyFviH? ),(VJx +^} t Y[82)\$ mjT9ܢōu ggiZm }jSmczH}Ü}ƞa!վv=Qsv(3lDIΧ `pNw 1t]VӜOZL&KᐗJH{/-[b8@9S9GLLܾ z՘SCY!kU~;z߁M |P }%y/Dmi*֖6YK 6? IFqA^OB*p997Wwd?6zK/2jf-}DcZ9nc׵gnJ{Hľ<˝ZTt<[o czC"F@~!^LȎт?zɝE՘uƼr`T~3я'gZ^~?ؼkN;?ȺlxIfѬ'Ҿ?Om9ͅLW;aI\fK'.GP֖g&x\fl]VJtY.+qYEǟ8;}qSfQ1ނqV7zTb}ZEP9],0HՇNhvxϝ=;iur3n{N W/4_W[&.igQ'?%K<4SHHRƿ>YÌvwߎ׏dyꯔU)"H ?_*]`(jH-cn=9$S1i6 hK҅9">vGn䷯ 5̯uʻ祶&Mx|n@  2@X9|ؔ#)q֔8ee -kph(V}RoiOGlsh6hŠB=~w!/iu\FrcOOh5'j-'D(C+B>M+l?'z]YO/gmg;gfOx*ii!.cʹ8}>akyCaS:X±5 ]4^WíW;W˥KVM[ [B5?o|ew>,W9vt_qvr~VQ.Dپ8aurJ4 Hta8߼nj_OC}0g0gh9pr6VgW0< #H@8譭էY}a+uW*X|=!޿7x wm`HAGKq}6ƋW^~0>C_$!^3q=2rퟜ\o]&BG?:еpщ 9_ώ7 %ٿS^$=米 ?HCCWґ$smAS%*(c6bA`lǒ(φژꀵnSJ\%!ȗ큲(rȫo"ׯ[;c@JZ R{pkpyM* Xmpr+rt6V\.]Ѣ_!] a;)c.cGc]ԉJܕ򼈥uX[}]F%!;pثx0*'h1AYT$cv*'bX⫵("?jy@1I0`ZK؃0jAsZ"*Ͳ3I삠a.oԓ!5ÇGE8 "GU?5ka̱y?fJt#qCР.s møZњJ_cTע.o :`e~jk1 <0Ĕ4@>.wZCu s`ad1h9%F}-qiӲPRM6'TS NE϶C.lmta듂<]d0.j}]O6g Zw,cՍ:3R/[{("EjQ3%sk{z~2Β C/\|gO7 e0/CJL aRe }%M]%@HVK,0l+MB r oE2Mup^Ș'͠1$4"HW`.z^40ﺬqm43gA*E9Hz@3jezH::I/aM=$]R&IhZ߀} LIS`ZISI%)qbL\mPK~Z')(t&,l W{ ZTMjcxJ4i†MضdJ`k؆t}WflZ uY'=? ?#{0aϗY̨#Ō!l|3C%iI\SL2EċE52 e~O 9,GK S\ ²ez>V[5]؋(¬PXky~V,?˘6͔ʵUđ~J\?Cj ̈8q징0QxWǘYh!ûz.L !4w Ɉor#1.z:4s-:W )s2~AdSضCٓ-2 /L9Cl:aC!r;P.ZrZY%%^֣/?bk. "#y%{O&T-n37DXAB#Vd*T9-"9wp:)iE5{byb=&~}&nW^6\r|aBC7ĘV}19E .=,`"J!m2z\eyݰr] sHEHY]q P(Uʿ~ 3(IV=3ٺkKPY <,jF_L{qْ)&[YTC5Q W,fT7恙jsFO!GTarTH4WsΘrjI;U\V2wYqA]9: j5ԢK,i)xEKEZ,B.ux "jQq}u2f10u]DzKܰx}%IQ@^}dl3& D*OkQS:n;<{ԩiߐ1Y ׅnN–R7=KSuQ|V(ْFcM-'Klo;Վ BT{>~rFA;zG'Ww Am TC!-i< ucۨڞ`ۨVe<],.FųAjfa,T٤Ǣq]5j`2Yi z]kǟw@750K^)1+v4>z7 Vg,HU(ڎ8,:]]tjpۨ4w;IymRWm,YH ݐUJPhv5,[3*Ѝ:bV*Y#5cR ("B6cRZ%B#eη刊Q{̍[B5⎨8ېht4Y@1az9cP`u֊ 1h#> rmxAqmS/A,zU+~K2s\ԯAB@'3TDjbr[G6Tv@PS>l-Lf+e3ԧU[+oPSu8lͰjޏ-#1ϙ}6x6&_ö|,)^MW_Vhh7꿿0x0ãqCwpG#baA ņΎ_%o۔o,M-}?o!{wަJިCFwf 9]WA\\Lf[xilϣTs1H QlHاEt(SAZ_Y X mkBTWx흍8 FSHI!)$FRHnw HYx3ꇤsaaaaxIǏ'U{o_ھgW9 o'GW {>~Jlo߾)*/N\ϱov[iZ_ձaJΝ/:6O- 92b?Tlk%?_21B sY5>:>c=1Ow y^- ڶ,XzusM#גU]>H_yYv!ۉ_mi Rus]Xm_g)YY)m]y,m z1aaaxEߓGקo/Y\k6xjgH|yu.\aæM&wk#ϐ$?]Mo\Ⱦ,/ڥQ@~6s?)}, l gX #vQg Bٙ^uのuhm?}{].~}v_J;xogJY]޳@.)oqC?}>@Xߘ'-(W? źvƔOʙRv[K?[A}?-wmՑ}g\=c}M ggg DŽ-B^k_g?F? v0||؎=ǧHPgs/hؑI t~{n^}ZyD5XWvO)"c0vY Z|~_%/,p\ɹyΰZ/;/xs_9?Pܯ5ݻ\[y|č8gʱL{? 0 0 _k3>z_\S |<)b|7aaaxn.ta?l^Cvkؽ#~e)3<3^kdlc&jK+o"e<.ʞ`^(3zu l+6v<ï k7]/lc[`On}򚄫 G뎱zt^v2)?;Wmr5ocIz?Ozx{&!ez."ѯ 1Gg{+ҏlw<=}GݽFƨ^)zIpG K֜{{e G12ۭqiumf>.}~a? 0 0 [u+7Svq֭y΅ ?ނ}XwŶv?ߩDZۓ-q/?߳=<~#>Fk"qzrQo 9r,nY[;o:)@-`ק-7({߯S@µK9֠ɸ>:n3 _[_*mtcmC>qSL=<6;ǫsaaa{xˌ\ފpx?0׋#5zяc]x^l򼠕(f:~٣^lin59W~\;?vn6erUbS~v^U O7O(|;+SG4|?f*?rW~2oNٟS9~daևmH6mX[J~s.ym4ٶO|Bd/b5ɿyU? 0 0 0 0 0 0 0.P~*1@G\⟿KrKXs2(ߥ纎J8'>X@▼QQbqwx b)_K|v 1M6kee-2Ǜ59?K^E~9ϱQﱮYF8N?~;:=J<-tĒyNAgC \NXKs)'^Kg\~2}6}Գ)n]Or^j~"{p29w6/.z-v:+M{WJYZ굢`% Ҥl9ힶկ#OUz+U?;sd~vND7*.Y+v:ye;8}~|+ÑޅN9}{Bƞ#txխsXɿkSV/uJ=o G<ջL'L:D]6jfgLz/+ؽ[{rCMYq~[{yy czA;w9zszWHVax3 %mkBTx흍) q ĉ8D^>׻gI@XjjgiЃ`0 `0 ?ϟ|:seQ3|ӧO|:2|.};7eGFO6_Qv]T]^ˮg{>pjzkuo{yye?{-x/ D:3D&򈼹e^Hyi#/OGzϪ߯_~ :sMe#M3Y#=2 QЙ[\s=E8}E>GȩT ڲTg-}VfoSVwzV}./>~!?U1<#}=F[ ~QڋBN..+푹^edLo+[\-k dW(}6q$#?z6Bөi?L7!3O_Q}Пuo[=tkȋM!'}/Ƈdr2_Cﲨ: `0 :8o=+8-4}۞cĥXdq{bUq©ήm!ƶg*ΪU\z[GA=^+ru{LV U?)V>ғ)x|Yҁgi\yi^cUo*= !TY?rfgWsʽVn*VX#=Fϫ+[F~yH\L~[O҇h5ݵTow|Sfӟ+);F;:x )/OS yUo2e)Ve3'wgGg=J^`0  ľu kU,Ksؑ5nY,bXw{ w&3QהNQev ]ƷgcH˞i{A3I8hwduwUIWq8I>+@pQşGcZ\ƪUߝ]/:3d;ɫ:gB9R|GW~w2;fzt|+i5nΟgZY|<1NyŬ|E7k?z/k><=Α}N΅>uWydʬdz `0 *\?W8GY:Dgcg< 2+'W6qn؟{ru"wU쏘~c#T?+y{Q,,^qF/Xv8.֩g3}ȸOP ~n%hUG4(_sn|W}Tg&x^c,Fѭ+ <#+}/Uw8BRh_|33!mr\7U9m({ѝpvew[xG]߱?g;,nҽow8]וb?OV=Z_#ve?vN_WrYLo;1g9pV^G~>[_vNOS3 `0Q[ veO\k^8֔v<Zbz\Opbn$~}oz3ј mK vU]^iNWA#x딫jt q :E= z%օq)CcYEqyRG-+u (K\hP'*^ء^q=m=y|Kvūe\rȊ4={W1;=ݷxp;o@>ȘT\Ԏ+C=*ɫ|GJOCW]x1.ﵠ9_Eб Vq)v(ʑ}[GwǺ{-oSdו_˞׃2;iT&w*w:g׭SOsj%Z[~_˯d֮+w]7 `0]kIu+eL]ւoA^;=GR?v쯱;<y o$N1紈=:ߥPVu< <&3KyC/4r)i=*/|Ύ^]QNН1qGw>ù{ ?Kv:A}E:_n+{u=rq͓̳]>>d}+|L01`0 leg:׺񶊝`W,3O?]\9P~[kOWiGc~)-<w.3q}'vuw$Vnv(r52S;Wk_Kϔ8B/hEՠ'9w?K;x:x<|@cϽVyc@ۖSw8Bq]=2lBe6V}eR( VeZT4ade2ޒ+nYBTqSߔ<[&=f[|szP)G}{Zׅ3n7jpWwftEw[ǽ;`l? `0 `0 `{~i`oLy>uoi\qK|}7Svu9G쯿c¾#>,jow{ՆݲL=mW2u_8دjo?kD߱mw>#}E:OۡO;y`$jwymkBT6x횉m0]HI!)$FR?6c>>~sm+vuՑνYu8uN?WP>1JsWiV_uKEϸ/rˆ_gKW]ױEYcl,[TYHT}xL#}A GV7^}>iҞ-i;}LJX&TP3T#ߨgJl e'=?͘ona|7>?ǐU%;/mN/IfQփz{G}?v✽3X~j{zTAO^ʰ>?sy|G)PU{ ..T}6ڳ-F`p]k߅~b  О$wݓٱ|sCoA+q3lOx@(0a+? T,_7s\Ϙ^Bl1)C+k(FyN"8dPC_9>O0&l4Im+nwGrŰ)/tihf ѸX>E)<,6s45zb?J\<OM%O#(76:= ӋYAƒH Ls6MXBcX&ǘJte. 3.je(??Lj=%wZizFTx$kP8Em jAOހ>~؆B9 ֤8UKCvjbL Cy ;mj P. DkwUE€3ܨ8xUJs\ɟ+;}sFQ(KIXݛƨ 1 +KdX];Jģcx$D׷X`i @l̏rnm$^9΄zBGϞQ=nfkDe; <a>,⢞jk0B[p($Ǡp4 nq`XƓ vϵ.xHnorJ5Hu뇗 f a[Z:>36[g RL؍?( &w.7C#~B{] UW 71jk~ecGrD.=K@WDZM0倐0\xvqNZ ># BE )&yA}t?B Ym(WIpɱ |2+\2 )l8tl@Z.Be񅋍RSƃm>dIl'N adĢG3%#)?$s _5=YBR#-k"qGP-e"f%֩-ϓ378M9ϊ,_*n;HEBƱcl~ ˝[/sagIE2,z1t:kLș壋G){7ond{@rP>kwk׽ #kXfyEAB9uM4P=_lgW؇N#_nGpp ,ZUu6ȓVӰ0EK7*|]{75F\ԶzQz! uH>upT٣o3P)[^6` -d&*=%fY<^ط`_6|h3ء>2 Pq7ώ ,NsjF=B` 큳CiU)R鐏@LҮǧmb<2FHRqùFXi䎲OmGA}:*u f:@ʫRH.66jcGOpO- 6HKJU:Jǃv,3DZEƮqq7p?ȌK%ȧ$;?Qr6pP7`a^=R_)m>D3#£ _' Iɭu͋C-Rne㯄ssL<ȭ/R)|Lt_1Lk=rr 4/gEr~PnB[\g[{gYvRW' {Fem1{ wL;7&$xc0 n&u@5sCCձm8Heft x{q(aтa?Q%l4ςxmWI׆GC1kQ3iJh,KRO`ʲ4)%b6B8\pe;u)ko)#WSncRx{[sXv195_0Kՙ7>Tp5ٴl3S"؝LX睫[5m Q="u}pϘ*xbՉ#iM+@Z! Ϯ~jYݬ$?5mtu] %@݅:4h8ۃtu3; ΑO1A/r R*5i&j#Y2:$Z(ad@>'z L뇶6Z8|`6"X1_z' F-я?X^ A:?1;h/KVB' vOnFS ƤQ{=kh7MwXQp\v͓O/. N3HKRlK"q^Wh1wt h@3e6N|I;y?8t[[! $,ήLe"z%IކAkRl!3u8ځy?_W)AbCO!rza5Sn֗#<43y6"R߃CQ&>[# BHǽ{vekOTlq(UH͵h ݔ8,@tՂL{p/*L"d_y k,4 G̖bD>,.ok"D;|7[.DCA#ilϟI֬Dq]+eE _-- ڰc^Lq1~CCC9gNH8BkhJ#Z-`VoMa 9r$պZ-hkh ?C$ ^tď9d(8P݅]ڶw[wl;dn׆oKd Hބ(DInI M_(5)6H/Y1 QRk,nXHʉ?>df&6^EJmt{CCc`0ʅv5x<\9Yc}106"״!֏9dl:' 1H"z'7QqɌ#KR./CVgQȬ\ `?d1yuM6Ƶ8ZX]8^pwQE &1frRKi$GݜЕh3'{;;~FK37ku<pdʎ+C RMzƏ7)nҀ lEGyl:̑IoBS%|ЕsTulebA}Aʹ10A{KʘӺtjdLI=r PRg_LbR Şl?␔)![Fo wi&k^CV(t@pW2{hxHGRn͉eCbxԉ6GQd27\ثdS=\Ff*0ۣOP5(rZߙxQZ>~GAeN-jY7Ҿn;n?ӹ"Px}/NW:݊&׾:x" ꭥу;R펔 c䛅љElmG§a= h¨BG_uYnZ쫭FYs U"zM&:Gnu.DX5Xn;}ԫ%XO?~2&Frjj8 yA*W I9/ub)Zl: s 85J>~iI3Yԕ;:#hELם[ROd^GA˩f~Y!En0~/A Km>^WYq"<цF*c:xw|͞w%ehRgd9̕v3v Dgh>>?3hYDkgC(ʹƒԕSԜ| 2Q94(?OGQ34 fccPopTYaW(>@tX4`LGٞpɄaŰl\[9c26U M6f,'C4i?W~psϠ?kAKrŵk@I|>^xs?\`,D̒5W^w DMXf_8<%|8_왉pP1Wlm߃f?4:́_Ԕv M;k:p_sj؎qw]$F}y ,b'N=o0, ~M YR46+!}@~ujctCP.Y(x׎z?70WXFܣo3z0c8RGg0 TU򄽻w"/4֏CQ`[{Ocn]+{{ N!33+5]qpj' r9FDȬ)~: 9Gmx2-?sraG"yvUpa;Ră A\& ?#n 0eed~oq嶭!!DzP^H)>oȑ.ļԶ=Hy7S-M ?8ycߧq|#5"2Б lm#UeΤVbM͘jAc7Z ]> 4gb s 2WRsKg6 's8qzTT[R[w)I95xWj #!nN+zPڔ KgTE,?{^RDݥ=Ru^zîc&D'i74SJߔ&HUG[crͦ<׿~4}څh;lpAZ%XZ;tQ?yk1+Ƴu6[ Dc4Ɯ*dB#!}e>samhG3c^8u9󼵕⸈߂UyB;f "Yi=D =4&|C3g]~WgjhSIXU"1A5Fr4{AljwTt6</N \Rta| i>T.Wo>>xϯY{緷m,J{gg}v~)]s!?wXGFl!7U|Cnfﳅ:.@mq%臔Ru?.:aBֺE#Gg'yXDuSWNJD)21ѵVagWPqȒ s?¶@g")s\T{f3go^w:^"{d#!φt},nyWFKv„X4|VB~,˘_&fjp/WԍwaO H 3I`u1ͤ+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_W|+_Wݚw)bIDAT8mKSa? tz.#(qׅta"ؚW]Ew!Evb^ts ׅeAZ*]H1Džs{xͰ|| )%=GqrNTe MLX:N΋P<mH[ 4iIB{9w\< riz; w@Xta9KTe >_φp?l2yG%x>2wVy+؂ ScĢ!_PC'H|L&n~F{X`P p/K7gs"M`a*w]~2N?OnpnJ8>"0Ԏ vކǣzZKeF]`Cf3K+,+@ _@ L5$ZmR<7y8˛GPem3mL9 Oo~ 7[m~G)>O3p7髣 -0xA$kgm\R.ojmP<'JY.;@}N⣪ST_˭trљhIENDB`gpodder-3.5.2/tools/draft/directory-ui/directory_tags.png0000644000175000017500000000134712220076757023201 0ustar thpthp00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<dIDAT8KHQANciCZD,Zzs!n\  eXE2j4I#lF{{[Ҍx8D)TO{V_Y౯dEzß̦Fn\ݳ՚e$ }`B Ny |OVѓ[l1:9^Y*ANj]y[r6ەcj,l5@#(*.98x‡].ؓ[ nCxx@qlť0 Nwlx.91)8)jo !No7Qҗik71cҊ!3ctR ֜y@-ik2Kk^X :s`TI&%y؁`<<<0${q`, vpAg\ƭIDAT8ˍ]lSu磧[MVMٔhDM(!|D/w:   W%HbG:6؂2 ڳn뺶ӿ8I/x'o\}**H̶~JԬy~oS$yl ?Gq叭w_rdcnMֶU^w^9*@Ol pm"Pܫ|\ynnxO_cI4OjhP@xjmt 84J ]/獌]tȅwaSZm#_z='pנ (-sEKϹ54)0``L"u&s+>Ü*gO{+G傒e%ʔD|9=pʑ wM*%%}n q!Q9OO7?vqw]$"rs~ѪrPP~Cke3ӡ#E[ +@)̙TbGYXX6b0Z!PH~ 4#쵭;~so"ΝVfJEk뉮 :.be32zvz/q&`R80ov%S0Ӌ `߳PQgp R]arJ7"zTXtSoftwarexsLOJUMLO JML/Ԯ MIENDB`gpodder-3.5.2/tools/draft/directory-ui/search_gpodder.png0000644000175000017500000000171512220076757023127 0ustar thpthp00000000000000PNG  IHDRasRGBbKGD pHYs  tIME łMIDAT8mO[u)2 =Af!Bڲ@f,ad AMc4܀$ĭj6 څ%MdV}@{>s ]9BՀCȦX~?z&A57>X[UUUxsm\.LMM]}`&ry~\-]$I5M+nEË󳿜d@ t:o~(G{Ⱥ&(( _G%vDZ;+壨v"N[s>}vkkkx<b+ 'bZ t9 2gUDǨw8`^MT``+c*q9?\k/0e""?0ͧ$=:F?w5%)jaoa3r@0ͥNζNC߱~l4r҈Bt JTQ~ &>}BJ!u5 MqdM@IENDB`gpodder-3.5.2/tools/draft/directory-ui/search_miro.png0000644000175000017500000000137612220076757022454 0ustar thpthp00000000000000PNG  IHDRasRGBbKGD pHYs  tIME A.~IDAT8˭KkqIfbjV VŪqVvѝ [Ab.[ >>DQRmՐ64d_UTnl.98 Gu4\M{4XZU ==K r:P-X+T^<=>;WA (?b Jܝm99R-^#JhίCD^Hp~U6w 9\dJm}4FD0aIq&//<XtF-E*);YI;Nȁa |CRkK$PAy/` f ,T>d>zLoOU/N Fĉ:1sM`8h~y(NF ŵ YXa\Rͣzuiv_w)wΙ}ښNqhV-RKgJt0Y=\IzHF+HDHF;f!ޓiz~ Ȓ|&?_"ɛikIENDB`gpodder-3.5.2/tools/draft/directory-ui/search_youtube.png0000644000175000017500000000067112220076757023177 0ustar thpthp00000000000000PNG  IHDRasRGB pHYs  tIME '.KIDAT8˝1HAEߞA,$gcvEB `ee;[c&U4jQ QH gL $Ys;ggz%'IIe?oI\^QNBFqW=F7"&6l2ORJ&f8)dPJ/StיOXܲa&d~@L?/P2 pw: fixup_row(current_row, x, y, max_h) y += max_h + 10 max_h, x = 0, 0 current_row = [] self.move(child, x, y) x += w + 10 max_h = max(max_h, h) current_row.append(child) fixup_row(current_row, x, y, max_h) self.set_size(pw, y+max_h) def unrelayout(): self._in_relayout = False return False gobject.idle_add(unrelayout) gobject.type_register(TagCloud) if __name__ == '__main__': l = TagCloud(tags) try: import hildon w = hildon.StackableWindow() sw = hildon.PannableArea() except: w = gtk.Window() w.set_default_size(600, 300) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) w.set_title('Tag cloud Demo') w.add(sw) sw.add(l) def on_tag_selected(cloud, tag): print 'tag selected:', tag l.connect('selected', on_tag_selected) w.show_all() w.connect('destroy', gtk.main_quit) gtk.main() gpodder-3.5.2/tools/draft/README0000644000175000017500000000006512220076757015706 0ustar thpthp00000000000000gPodder "tres" draft implementation / prototype code gpodder-3.5.2/tools/fake-dbus-module/0000755000175000017500000000000012220346122017033 5ustar thpthp00000000000000gpodder-3.5.2/tools/fake-dbus-module/dbus/0000755000175000017500000000000012220346122017770 5ustar thpthp00000000000000gpodder-3.5.2/tools/fake-dbus-module/dbus/mainloop/0000755000175000017500000000000012220346122021606 5ustar thpthp00000000000000gpodder-3.5.2/tools/fake-dbus-module/dbus/mainloop/__init__.py0000644000175000017500000000000112220076757023724 0ustar thpthp00000000000000 gpodder-3.5.2/tools/fake-dbus-module/dbus/mainloop/glib.py0000644000175000017500000000005512220076757023113 0ustar thpthp00000000000000def DBusGMainLoop(*args, **kwargs): pass gpodder-3.5.2/tools/fake-dbus-module/dbus/__init__.py0000644000175000017500000000040712220076757022120 0ustar thpthp00000000000000import dbus.exceptions class SessionBus(object): def __init__(self, *args, **kwargs): pass def add_signal_receiver(self, *args, **kwargs): pass def name_has_owner(self, *args, **kwargs): return False SystemBus = SessionBus gpodder-3.5.2/tools/fake-dbus-module/dbus/exceptions.py0000644000175000017500000000013212220076757022535 0ustar thpthp00000000000000class DBusException(Exception): pass class NameExistsException(Exception): pass gpodder-3.5.2/tools/fake-dbus-module/dbus/glib.py0000644000175000017500000000012512220076757021273 0ustar thpthp00000000000000 class DBusGMainLoop(object): def __init__(self, *args, **kwargs): pass gpodder-3.5.2/tools/fake-dbus-module/dbus/mainloop.py0000644000175000017500000000000012220076757022164 0ustar thpthp00000000000000gpodder-3.5.2/tools/fake-dbus-module/dbus/service.py0000644000175000017500000000031112220076757022013 0ustar thpthp00000000000000 def method(*args, **kwargs): return lambda x: x class BusName(object): def __init__(self, *args, **kwargs): pass class Object: def __init__(self, *args, **kwargs): pass gpodder-3.5.2/tools/fake-dbus-module/README0000644000175000017500000000035712220076757017736 0ustar thpthp00000000000000This directory contains a dummy "dbus" module for use with gPodder on platforms where D-Bus is not available. The dummy "dbus" module will do nothing, but still allow gPodder to run successfully without the need for the real D-Bus module. gpodder-3.5.2/tools/i18n/0000755000175000017500000000000012220346122014466 5ustar thpthp00000000000000gpodder-3.5.2/tools/i18n/generate_commits.py0000644000175000017500000000337612220076757020414 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # # generate_commits.py - Generate Git commits based on Transifex updates # Thomas Perl ; 2012-08-16 # import re import glob import subprocess filenames = [] process = subprocess.Popen(['git', 'status', '--porcelain'] + glob.glob('po/*.po'), stdout=subprocess.PIPE) stdout, stderr = process.communicate() for line in stdout.splitlines(): status, filename = line.strip().split() if status == 'M': filenames.append(filename) for filename in filenames: in_translators = False translators = [] language = None for line in open(filename).read().splitlines(): if line.startswith('# Translators:'): in_translators = True elif in_translators: match = re.match(r'# ([^<]* <[^>]*>)', line) if match: translators.append(match.group(1)) else: in_translators = False elif line.startswith('"Last-Translator:'): match = re.search(r'Last-Translator: ([^<]* <[^>]*>)', line) if match: translators.append(match.group(1)) match = re.match(r'"Language-Team: (.+) \(http://www.transifex.com/', line) if not match: match = re.match(r'"Language-Team: ([^\(]+).*\\n"', line, re.DOTALL) if match: language = match.group(1).strip() if translators and language is not None: if len(translators) != 1: print '# Warning: %d other translators: %s' % (len(translators) - 1, ', '.join(translators[1:])) print 'git commit --author="%s" --message="Updated %s translation" %s' % (translators[0], language, filename) else: print '# FIXME (could not parse):', '!'*10, filename, '!'*10 gpodder-3.5.2/tools/i18n/merge-from-transifex.sh0000644000175000017500000000336412215615137021102 0ustar thpthp00000000000000#!/bin/sh # # merge-from-transifex.sh # Fix problems with the "tx" command line client by forcing a download of # all translations and then using the downloaded translations as a compendium # in msgmerge to update the .po file without destroying existing content. # ..which I think is what the "tx" client should do all along?! :/ # # Thomas Perl ; 2012-01-21 # set -e MERGE_DIR=_tmp_merge_dir MESSAGES_POT=messages.pot if [ "`which tx`" = "" ]; then echo "The Transifex client 'tx' was not found." echo "If you are on Debian: apt-get install transifex-client" exit 1 fi if [ "`which git`" = "" ]; then echo "Please install 'git'. We need it to revert changes by 'tx' ;)" exit 1 fi cd `dirname $0`/../../po/ if git status --porcelain | grep -q '^ M po'; then echo "Uncommitted changes in po/ - cannot continue." echo "Please revert or commit current changes before continuing." exit 1 fi rm *.po if [ -d "$MERGE_DIR" ]; then echo "The directory $MERGE_DIR still exists. Please remove it." exit 1 fi # First, pull translations from Transifex, overwriting existing .po files echo "Downloading UPDATED translations from Transifex..." tx pull --force --all FILES=*.po echo "Moving files to merge directory..." mkdir "$MERGE_DIR" mv -v $FILES "$MERGE_DIR" echo "Restoring original .po files from Git..." git checkout . echo "Merging translations..." for POFILE in $FILES; do echo -n "Merging $POFILE" msgmerge --compendium="$POFILE" "$MERGE_DIR/$POFILE" "$MESSAGES_POT" --output-file="$POFILE" done echo "Removing merge directory..." rm -rf "$MERGE_DIR" echo "Running validation script to check for errors..." sh ../tools/i18n/validate.sh echo "All done. Please review changes and stage them for commmit." gpodder-3.5.2/tools/i18n/summary.py0000644000175000017500000000371712220076757016563 0ustar thpthp00000000000000#!/usr/bin/python # summary.py - Text-based visual translation completeness summary # Thomas Perl , 2009-01-03 # # Usage: make statistics | python summary.py # import sys import re import math import glob import os import subprocess width = 40 class Language(object): def __init__(self, language, translated, fuzzy, untranslated): self.language = language self.translated = int(translated) self.fuzzy = int(fuzzy) self.untranslated = int(untranslated) def get_translated_ratio(self): return float(self.translated)/float(self.translated+self.fuzzy+self.untranslated) def get_fuzzy_ratio(self): return float(self.fuzzy)/float(self.translated+self.fuzzy+self.untranslated) def get_untranslated_ratio(self): return float(self.untranslated)/float(self.translated+self.fuzzy+self.untranslated) def __cmp__(self, other): return cmp(self.get_translated_ratio(), other.get_translated_ratio()) languages = [] COUNTS_RE = '((\d+) translated message[s]?)?(, (\d+) fuzzy translation[s]?)?(, (\d+) untranslated message[s]?)?\.' po_folder = os.path.join(os.path.dirname(__file__), '..', '..', 'po') for filename in glob.glob(os.path.join(po_folder, '*.po')): language, _ = os.path.splitext(os.path.basename(filename)) msgfmt = subprocess.Popen(['msgfmt', '--statistics', filename], stderr=subprocess.PIPE) _, stderr = msgfmt.communicate() match = re.match(COUNTS_RE, stderr).groups() languages.append(Language(language, match[1] or '0', match[3] or '0', match[5] or '0')) print '' for language in sorted(languages): tc = '#'*(int(math.floor(width*language.get_translated_ratio()))) fc = '~'*(int(math.floor(width*language.get_fuzzy_ratio()))) uc = ' '*(width-len(tc)-len(fc)) print ' %5s [%s%s%s] -- %3.0f %% translated' % (language.language, tc, fc, uc, language.get_translated_ratio()*100) print """ Total translations: %s """ % (len(languages)) gpodder-3.5.2/tools/i18n/validate.sh0000644000175000017500000000021712215615137016624 0ustar thpthp00000000000000#!/bin/sh set -e for translation in `dirname $0`/../../po/*.po; do echo "Checking: $translation" msgfmt --check "$translation" done gpodder-3.5.2/tools/mac-osx/0000755000175000017500000000000012220346122015256 5ustar thpthp00000000000000gpodder-3.5.2/tools/mac-osx/Info-10.4.plist0000644000175000017500000000303112220076757017621 0ustar thpthp00000000000000 CFBundleName gPodder CFBundleShortVersionString __VERSION__ CFBundleGetInfoString gPodder v__VERSION__ CFBundleAllowMixedLocalizations false CFBundleInfoDictionaryVersion 6.0 CFBundleExecutable gpodder CFBundleDevelopmentRegion English CFBundlePackageType APPL CFBundleSignature GPOD CFBundleVersion __VERSION__ CFBundleIconFile icon.icns CFBundleIdentifier org.gpodder.gpodder LSEnvironment DISPLAY :0 CFBundleDocumentTypes CFBundleTypeExtensions opml xml CFBundleTypeMIMETypes text/xml application/xml text/x-opml CFBundleTypeName OPML Documents CFBundleTypeRole Viewer gpodder-3.5.2/tools/mac-osx/Info.plist0000644000175000017500000000267612220076757017257 0ustar thpthp00000000000000 CFBundleName gPodder CFBundleShortVersionString __VERSION__ CFBundleGetInfoString gPodder v__VERSION__ CFBundleAllowMixedLocalizations false CFBundleInfoDictionaryVersion 6.0 CFBundleExecutable gpodder CFBundleDevelopmentRegion English CFBundlePackageType APPL CFBundleSignature GPOD CFBundleVersion __VERSION__ CFBundleIconFile icon.icns CFBundleIdentifier org.gpodder.gpodder CFBundleDocumentTypes CFBundleTypeExtensions opml xml CFBundleTypeMIMETypes text/xml application/xml text/x-opml CFBundleTypeName OPML Documents CFBundleTypeRole Viewer gpodder-3.5.2/tools/mac-osx/PkgInfo0000644000175000017500000000001112220076757016544 0ustar thpthp00000000000000APPL???? gpodder-3.5.2/tools/mac-osx/README0000644000175000017500000000027512220076757016160 0ustar thpthp00000000000000 These files are used by the Mac OS X (MacPorts) port of gPodder. For details, see bug 942 . For questions, please contact Eric Le Lay . gpodder-3.5.2/tools/mac-osx/create_icon.sh0000644000175000017500000000063712220076757020111 0ustar thpthp00000000000000#!/bin/bash cd work/gpodder-2.3 # create temporary directory mkdir tmpdir # create raster images for the icons for i in 32 48 128 do rsvg -w $i -h $i data/gpodder.svg tmpdir/gpodder-$i.png done # get the small one cp data/icons/16/gpodder.png tmpdir/gpodder-16.png # create the icns file (thanks to the icnsutils library http://icns.sourceforge.net/) png2icns tmpdir/icon.icns tmpdir/gpodder-{16,32,48,128}.png gpodder-3.5.2/tools/mac-osx/icon.icns0000644000175000017500000055317112220076757017116 0ustar thpthp00000000000000icnsyis32/ܽ$z2g qݛig 96A0Z.ك RAY݁ %,@Ձ A B&!́ 0$Ke߁ ͝eD{@xH<29}+Vz85@=;?C>?AinACm>>M{|x|}}~~xwtA9A@@A@>>?ܽ$z2g qݐig 6)--Z.ك R4Y݁ %,;Ձ A >&!́ 0$9e߁ ͝eP}}|zC9CBBCB@@Cs8mk ctRWqw,)N "3 Mn8_il32g 0C 76 g_iE $Ld?f3f /#B,*Ob- ԌR63/pQ) e Lnn VO/P mFkXpD  vFX)|'Ll oC^t tv#'v dߊ[J%wh M0A HD@?=Dv<=><7=R `F@CEESlQM =H_YQHFEFIQ| y`> >fZ=>qE9=\eF: 3?FWn uj]QC;21@ 3)/8fW eK2,/13?Sc=< ,5ID=64326>_\W Yce^dfifadJ) )MebdfgeddcYWY[Y[\eE+,W\WXXYZ[[\]dd1+Hiea]\]`beggM3+-3BUeghhjijjkjjhgcZQH>0,.1@3 /-.01236532 11..-.21258I@@.313717457224865173:0+@3UU@3+33@@Ug 0C 76 ibkG $NgAf3f 0 #B,*Rf- ԌR83/pQ) j Lnn VR/P nIkXpG  vG\+|'Ll tF^t tv#(|dߊ_M%wh M1C JE@?AEwAA><7AT cHAFGGUoSQ =Jb\SKHHGKR }b> >h\A@uG9@^hHB 3BHZrynaTF?6=@ 3=<:?CEFFGJJG FEC@=<;6698I @@.3137179:7 486517=:0+@3UU@3+33@@Ul8mk@߼h UfU@1nMd4GYm{^B[%nR9 &x2 sK9~̾L/O>&K<.JcG pB =M|6b7- ,A4899631v) 9$ $AUt7>G { 3 2,S8@|}X<1 W^ /=[|}@?6u  ]6?"}h<2R[ ?9Q~E9E$k'Ne(O*+%]l;;e} }b?,}3?>>:fgB _n>\b<'["}V- 7b M! 3 Hأ6Wz~!~p ^ ZV"wj2 { Z|~!5S y #L p} ~zp# [#D s#|#~{'"Lu6W|~|aEZ6S~~{3U 8S[|x)}Ƹpr+||[s*u56s~{;v s^P{|#  cb1|uBHW"+*|}dm Ij] izT  WTwEA dK1Aw:|K,(; 0w1 0  h $y-  1{*(  Dz}( NRu+l  Ys-4^q3 RW P+?SPZr~:d ei 3 8 Vt~E  LI 7Iy}S #1S6 8|bw*K/6 %!}rN  %9U-|&O   -9;}}1  o@N}}K 1x3 } hqb~~g X0h N5>v~~. K tSg  { ?&|{:l  =(66T K ?{|a[ H`Tlda|~~-g #_ }-~{E?$:Zl"J12y9{~~u :fe|2BHe}~{9HD(W]!}$~s A .S%TNU{~~{BN KR  }~ 1 Ȗd>  tE $\|}gu* ԥl, U.|~{M  Z r~{@ qx  Nd fv~~zK#̝7eO6 s0 U}_ e  o 4 Rmd2)S~}l Lg #N<<~~yB0?P>f M  */>d}~~?3}˙:;R}G6OuTl W5J~ ~O<<tF1/16203Z5E }g=1wݦg=/2:>?BEBB>9 [4F ~>A4弅U?EUl~R?2 I8J~ ~i5B2ɡ|[B116;=?H\u@9O 1=[}$~Z5A3;maU?5/159=>BN`y R:; ʔ7B8~~d<3/0/45:<>@EN[p _=3w/1./0019H^z c0A3h~ _IB@>=>@ACIP[hx~g>/2u'G=;85100<>W[~ϴsP35?8h~vkihhmtzl>1"0G:f}|uk^SJDA>>::550/110?:0 502;gym`VNIDB@=98:99: 8:=?EP`{~~~}~ m>0 N8D$}ukd_\WSONNPQRYaju~}} ~}}~ k>0<;P}~~}~~ g=03=\|~}}~ }~ ]=1 />g}~~}}~~ ~}~ O;; 0>n}~~}~~ A6Z /@u~ ^=1 /Ay~~ 9?5 /B}~EF5 .E~ǃL<.B /B~~~̓H:=Z/>\Ƀe>8E+H5B9kpJ7=?:2'p C;;Z jI7:@=7-/9@3` *:=?7AdqV?7:@?91,-,($-9? 6 ;3,5;@<6>Vp wdO?78=A>81-,-+/0-)'9-UG1/(0+/6=A>77?QdvugYL?869>A@;4/-,.-,,,.00(6 >'0+.,,/3:@A=968?KWes}wmcYPHB<867:>@A>940-,-.-9+.,/9z3+..-.-,,-04:>@@>:767;@FNW_fnt{/|yvrlf`ZUOJEA=:86779;=?@A?=941.--,,..,-,-:./--/c7*/,--,-.-,,-.159=?AA?><:776689;=@CEHJLNQSTUV*UTTSRQNLIFDB@>=;:987667789;<=?@@A@?><:641/-,-..-,-.--5d >(0/,-..--,-.0368;=?@@A@@??>=<;;::989 ::;;<==>??@AA@??=<;976420..,--.-+2)30&6%/0/.--,-.--,-./1135678:;<<==>>?>=<<;::9776554210/..-,-,+,-.-,,--//1),95)>+&(,-0/..-,-..-.-,+,-,-.-,--,,-.-.-.-.-,--,-./.0/-*'&6:> 2?90*&'),./0/-,-..--..-.-.--.-,--.//0/.-*(&(,4=> ,9>:4/*&))-,00/1/./-.,-,-,,-.-6,,--,-,-,-,-,--,,--.--./.0/00.1--+)(&&(,27==3# O s6 )4<84/-(& %'*)(-.-,/1/020//0/0//.-.-./0//00/011/ 01-,-.*(*)%&'+.17:==9/"R0Z//17@9>>:8641--+*(%'&''&&%&%&*)*))'(''())*)0*($&%%&&(%'&&)*,-/2578?<:899884786*795688989;>?<<>:;A;9106-  %,VsΘSbD#+  "! !! #( *\Xb˛YZZ[\Y_7$!"R]Z[Z\Uq şscVZbh{ڞ^( #S 9    0|W   OF  -=<5) @ cOW Wjra1 m9**;o6b7- ,.&'($i) 9$ .*4BB6*2Q%  95%ImqrlO$6g0   t9(&Nxnou^#4Y -=vlofgpluV%+5 { 3 2,B%-fqo^TU]pmu@+x W^ ,CtoeTYXU]opj--"u C N"-_slYVWVYTdotN+R[,&:ppfUXWjqj1&2$k'Ne(O*+$^e%*Jvm_UXW XU`nuI.} #hpmYWXjrf-(2:fgB _n>\b<'DyfW"XUapq@ 7b M! 3 Hأ6ClRYVW!V[ltV ^ ZV!wj2 | ?\UXW ey(S y #L MZVXW VYSfV# [#D s\UXW"XT`"Lu6;]UXWWXU\AEZ6SYVXWWXT^"U 8S=]UXWWXQ)}Ƹpr]UXXU]=t*u56 NYVYT^(v s^6^TYUY  cb!]UXXOBHW"+)TXV\Dm Ij] G\S_8  W9_R`/A dK1,`Q_'|K,(; !^R_! 0  hZS]  0WU[(  DSVZ NQOWZl  Y MW[4^ LW\# RW P+?SPZ MW](d ei 3 8 UNW^/  LI 7HRV^8 #1S6 7VU]Bw*K/6 $XUZM M  %9U\UXW%O   -9(^UV]!  o@4^VU^3 1x3 } hrB\VV[FX0h N5=PYWXVW. K tSg  { ?[UXXT^'l  =(66T K +^TXWU\A\ H`TleA\UXWWVX-g #_UW,XT_.?$:Zl"12y&_TXW'VYP :fe|2HD\UXW,XT_&HD(W][UXW#VYOA .S$TO9^UXWXT^,O KR  YVXWX 1 Ȗd>  tE $?]UXWXV[Gu* ԥl, V]UXWXT^4 Z rcWXT]-px  Nd fYtXWVYSg9#̝7eO6 s0 ?wmcTXWXV]yH e  o 4 Rmd2:mqiVWXU_kzN Lg $A')_rm[VWXV]opW.8Q>f M  +-HunbUXWV[mu\-o˙%)9qpgUXWYlqf1#>벃gC] F"4jqiVW Vipo6*(ߛg3#J"0frjW XUeotI+jٝX*(--/0/1+& K!1grjW XU]oqe)/ zC( *--0:L[bh8-s 6%4lqhVW VknsK#/zĘoK/#*-,0?Sfqsspue,&> +AtodUXW3XV^pno?$/'^xuzRD,!!',,.5CWirsqoonomo9)' Ŋu|t#.&`rn]VW XUgqnoG(+* #(+--06?Pamsspoonki]gosB,i%6Nm S."MsniVWjqnr`C2..,"-.//38?IWcmstrpoonic^[[VbotI-4g5*0/--,*&!(*FKr{˭e? -&Ornp[VW.hqnqtk^TLJJINSX`hnrtsrpoonkf`[YZ\\^[botL,5%HZZTLA93/.-,))"! (,(//(+**,% "+.:`rnq^VXWV`moopst srqpoonmjfa[WVY[]]\\]ZbntN- w*Ixrt sojaWMB<630/.,('(''(&(,.3;H^rrom\VXWXUW_glmnonnmlifc^YVUUY\]]\ ]ZcntM-2<%/dplonoopqrstspmhb[TLGCA>:8778:;AGOWdottpmfXVXWXWUUX[^ab`^][XVUTUWZ\]]\[[\ ]ZcntL,(*7npl[_bfilmnooppqrstrrpoppqstuuspmjcZUWXWXXWVUVWXYZ\ ]ZdntI,,@rofTVUUVXZ^aehjklnnop onljgb]XUVXWXWWXYZ[[\ ]ZgosA--HtocUYXXWWVU VWY[^`acdef eddc`^[XVUVWXWXXYZ[\ ]Zkpn6*& -Nto`UXWXWWVVUVWXWXXYYZ[[\ ]Zbpr_-"I t.Ttn^UXWXWVVWXYYZ[\ ][]pmtA- {/Wsn\VWVWXYZ[\]Z^omr]%-" x/[sm\VWXXYZZ[\][[cpnqi-5!y{1]smYVXWVVWXXYYZZ[[\]\Z[`kpmrg3+1v/[rngVVXYZ[[\]]\[Z\bkonor]0))H-?umpmc\Z[]\]]\\[ZZ\`fmonoskG*'0E!/&Lrpnomf_[ZZ[\]\]!\\[[ZZ[\_chlnooqsjP2&+)+6  'm.)(>dsqonnlgb_[Z[\]\]\[Z#[[\^`cfilnnopqsoaK2&)+*.34?H<`50),&,Gapsqoonmkhfb_][[Z[\]\[Z-[\\]^_acegiklmnnooprsrmbQ;+&(+*,2645/,1?J,5*G560)+*&*4+'&'*++,.255445543546:-?$ A1944653.+*'%&+4=HR\cimprsrqpopqrsrrqomjgc_[UNF>72-)'&&(*+,.14654454553572By"=05454 541.,,++)(&(,06=CHNSY]`cehjklmnonmkjigeca_]ZXUQMHC?;63/,*('&'()*++,.13654554545440Ca#>16445466430.,++*)('&&%%&'(*,.023568::;<;::9986420/-,+*((''&%&'())**+,--/02456 5445545545545460Eb A0:4454 55445565421/.-,+**))('&'()*+,-../0123456656545544545545539556::*8665454 5455665542210/.--,--,--./0011233456656554545545545454 5682+H 5;F0.0467765443445445355466565432345654545454644535457 52.-9J>BG?3/-/24676546355255246434554346655435654433434543456654456534553463363554667631-.09CI-( #9DDA;4/--.12466767765754465334554356543456543456543)4553345544665686675622/.,.18>DDA-L(q6 &6?ECB?8702--/.-03116745788578766755677676766567567)8579874674032/-/.,01299CAFB<. "Qw辍[0 .1B=EFC@B@78:5,104++.+/1.-/.,.21121232114431123121120,,/.-/1-,.)121//:97;BAAEG@?<-( 'Bt/Ц`F&  +/)6D=>AA,,/"  %1UtϖSbD#*)  $1?9216<<%"     !+&,\Xc ͘Z[\Z`8*,+)*,,$!S^[Z\UrşscVZbh{ڞ^( #S 9    0|W   OF !-=<5) @ cOW Wjra1"{M@@O}6b7- ,C6::;853w) 9$ 'C>NbaP>F.b%  90I:ir:I.v0   t)M>9m:H.Y 2@Xx9@H { 3 2,U:B[>3 W^ 1>^CA9u  _8@"l>4R[ A;TF;G$k'Ne(O*+%]l==i eA.}5A@?:fgB _n>\b<'^"Y/ 7b M! 3 Hأ6Z!t ^ ZV"wj2 { ^!8S y #L v t# [#D s%#("Lu6[eDZ6S5U 8S_})}Ƹpr-_s*u56y>v s^U%  cb3{BHW"+*im Ij] nX  WX}IA dK1D|=|K,(; 3}3 0  h %/  1+(  D* NR{-l  Yx/4^v5 RW P+?SPZx=d ei 3 8 VzI  LI 7IW #1S6 8gw*K/6 %#wN  %9U/&O   -9>3  o@RO 1x3 } hqgl X0h N5>|. K tSg  { ?(<l  =(66T K Be[ H`Tldf-g #_ -H?$:Zl"J12y  tE$al u* ԥl, U1P  Z rB qx  Nd fzM#̝7eO6 s0 Xb e  o 4 Rmd2+Vo Lg #P>=~D2?P>f M  *1@hA5~˙<=UI8PvVm Y7L S=?uH3238425\7G k>3xݧi?24<@@DGDC@; ]6H @C6彇V>26>@AHYqUA3 K:M m6D4ɢ}]D438=?AJ`zB:Q 3?_$^6C6=ncVA8237;?@EQd} V<= ʕ9D:i>51322167;=@BGQ_t b>5x1301224EDB@?=:6323>@X]еtR57A:kzpnllryp?32IEE?A@?B<2 7>AQ r@24=k~qdYQLGDA?;:<;;<;:`  a?3 2?k R=< 3@s C8[ 2By b?2 1C~ ;A7 1DGH8 0GȈN?0C1D͈K<>\3@`Ɉi?:F1I5D;ptM9?A8@Yu {hRA9:?B@<9767+9:73*;GTCH/7758;?B@99BTh{yk]OB;8;?BB>:8767<1=2'F0;4879>BB?:8:BN[iw{qg]TKD?:89ABB?<989=BHQ[cjrx/~{vpjd^XRMGC@=;889;=>@BBA@=:887667876767:1N]0@49686678;=?ABBA?=;9988:<=@CEHKMORTVX"YYZZYXWVUTQOLIGECA?=<;;98899:;<=?@AB@?><:87 6786:0N`H.>678:;=>@AB AA@?>==<<;;:99: ;;<<=>>??@AB A@?>=<;:9876676:83I=<-;98867878776776787889;;<=>>?@@A @@??>>==<<;:9887676767 66788;5-J 4AG2/37998877676868769688676767667667677677878787 678678596867 899851/;L!>#CJ>61/14789886765966:75798669877578876577878786678+65788756885698587576787:9:88520039DJ5 1);FHC<6400134789:9:9:977976589664599776547:9876789 545678:94567:6!9878::9:9:8854200259@FHA4Ko9 ,:<=31454,.13100.02232147765328345676213322./1022/-/644/:=<:CEEDKF=H0/ +Dt-Ц`I&) $&:,)?K>=>MMFFEDAGGCCDDC?965;=>=<747CK0*37"  )2Ws&ΔTaI&)*   , ';==?>549@= 5($ &*&2]Xcׄ ̖Z [\\]YfB'.*+()++-,\_[]\[Z\Urt8mk@     'HmqW4  B}ȐL  HU x y <@91G<O0V?DsQ$u..9.J:> TqY m0v[@% G ; n &"!tL S\8>wzIѧ~J8Du^+~5' ph-32-& "$DԨzTGNXSIGE?81)   ):82DoѯoXQV_b\USSOKE>7.$  '-:FHCAKdxfXTV\ac_YVVVTPMHC<5,#   )/3;DKKGCBIVh´tg]WRQSW[__]YUSRSROLIFC>93,$  #)-/27=CGGEC@>?CKTbn|ýyqiaYUQMMLMPRUXYZYWTQNLKKKIGDB@=:73/*%   !%')*-048<@ABB@>=<::;<=@CGJLOSWZ\^_`abba`_^\[WSQOMKIGGFFFFEGIJLMOQRSSSRQOLJGEDCBBA@?=;97530.+(%"   "#$%'),.2479;<=>?>>>???>>>>????@@ABBCCEFGGHIJJJJIIIHHFEDBA?><;:99888765431/.,*)'%#!   !"#$%&()*+,.//01223333333333222110000/////....---,+*)('&%$#"    !!!!!"!"""!!!!!     ic08W jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 j$ Z)jJR+{Y8NO 0ZU\?i ,) D[ʲ,0Y fv3%(٫C+K4ӥE `3͡{ѯ>Z"(٫_%2` u"\bh( X_ߥiJe}1.d*LhMշ]\hsiXqNcL@4Ūq2r?рF3]}aŨKZ]iҸ@ľTXlht2OX jQR!و'_⯰TL3Ck~P'4buB+D~>p&4ja iηIܛDžV25 \gn%. 2 u2H/I(:[P{l$IZmr@|J8DOnUE3^|9lj>v) ZJut o wxb Vk"<ɝy9F5裱  Jj4yTU A1κ=*lZa";VJ?+1Jp!lM906%˹IrGÝ"٦?d9&dOIߓWFʌye0C(WM]^ qˮ!sf= '*oD8.(\H?a/FۨlQ[EU4okց]wp5Up>zFuVKDfh\GA^1*6k_݃[C2갓iصj@nH:p vc\cɦZa؉m>Ffb}Z9()4 K:z<|/BuE\IAZC A\6F\-YZ'•..KM#VNnG8'RδS46}V&Ѿγp*źw]- 0|iY0Pn`C$)~]mXZBgJ,'zʕNG9ǡWTr9 +iRt{ 1ׯ6_o^n-iX-4D0fs-Q6ݼ msdԶW9s! nsx_pp'ڃP0/Zgct57jLfQ-&I;$HG!htsFeϻ- SO͕xܺ>m.zhPÿLE8x9,Z4c9$Y0FP|#L@w{:IJSsAƼfFRD(ZVqRX nˉ__#]OT W&<;1s'l֌A: Dm' n#A"_lۭ*0tPiM8$8Ow*Qc"zxC⍻1'Lj%$AF(!'rD g P[ԸAHlZ>5h2^u"/fW:~K [&nIa 8H,m~sSkNHYէrp jҡeg@++}wJWup4":bq<5'`k,.Tdҧ?/xJhR )ܧ7i\AQ2pR'?DgXB>jSDYX.ō6-֊y=I8tX?م!E_ ^bg'6{jI/Ervh z\Q NU8rZw:~e )(J*O@mnJ\54tKorT>Xc_x3\ӚP Bf$ӣA k d$eÍx#cH6Tp0 of UYL;]މ?hW%˘nG]P%OƏ9֑Jt>FS.1=_C =daqTm㘟#AgW̠k&>@R\ |~AhWv w>b,ZXA0đP#WZq 5E*C@)M[hw/'P*;ض/HET1@9P9pLX8RtsIѤG뜼 V(51 ;'u֢2[S_)cӱʆ R 1Wc`tbg~YxX>.*få^\/3puå9vu RN6[88K%6"h.LW`umڹ ]CAUQ+{9""uaUC3yO}b kK2u3 측M{zCl?iϝ6u; ܞuR[$o6@Vh]9bnSygDw >tJw}8rIx@bqw`1\f-`*R $6]PHsFLmj uotnҿ;tR1$\ _AO>]i e rlPqh"4ࡧ9DɈJ"UWݕXN'QVkpLi c;<7HK~!alT=2')*5Rͼғ8;3Nˑe#S}@£hޣ~.o>U./msYZҎ7(53ãlȀy/\r50\Ux-wgDuX/yη "ez~z=;:c%Sfp4}Ts;~P_5=5Zlkt gO17XA q '-JQ-vr2R+YôaER5w9JED7"qyJJ^(N%KSq$nP 1=@N:y̯5a7qY^X3K̜CB^Axcm~4`3 0woMhՠG{k+R |g2Vݦ8Mz+!mz{$<+$Ġꂵ,HL!#()W$>iE2ms0Dq*QO]!3lu>2-3b̹ qZ]tP]gݰC!&kk>цK5_O:wb{'I}N"f2~-g?'t%%HOi{$aO mۛhς%KZgc-X%ÛYd/QE 0vms Q8!uٻE ݉ig-_9usn"l>e,{Tjn0Qjp% #7 f/c%Jd@ GW5Br:= 'ұڽ9 aWl($^ ɿ$O3m͂bQld1W>PR'$^zWo.}DP݆[Ԫ y_p3$qA=o򆑘e=ƵƉmϝRsLm`bu yy+H`F|6?%C<Ɓ+W;rbx5H /ta@ =[] kiX,^0\!%g+CVQI[~:s3{,^?7`@ׄ%s#^[PY5\?Fk8;MB rκ@I}п*){r1.:w`}ë`x[=M;fAşWM ҚaN!S^ïƏ|X{jJb"SNs'ukv>E!9u?նr!VCq_U=.[:ka|$'SS9i oBmd4{Xm]L]ߥj DW QJ"^c)q HbhKT%R#ܣP/@VZ1,@ z{gIۡ\QO\>KœsӃ-ˣ80Ҩ6ߋ!Q:xTH|yU zǵ#<$Q_,%,6V:QݎRXv\BmܫV{ӫd2X-_9|l5Ρ/ƣ[䅯TzAǻqLq:ppd}Ac>Q$ S4{ݡ2qFT\u(i 9{*a|leRmnf(6_ПxX[ed޸ykAPJfgI=\0ju]m`pVk+.\?fj2 LrF᪲{3P1J2\Ak_cՎ>U$8<6{K1t.!2o/(t5l3mNghaU5QP,m{sWvck 8&P+%~Q ܳN_蓮v#(CU#X!ŒLq>k~b{󒍑"jihgB&Rnrs1#N[zl{W7G)5J(_Wљ }* u4oueGz;!B|%1SB-1%Pճ #)XD[\PmZ/ul]AL-Ƀ3hCMN33).g^\O \ծ1UUg.$Cm,(u XoҼoqZMY+&dS^x[ϫm{`%^OVp8k nmJ#a]~Jua'x™7;sco Pk>5R_12߷e[+n۵vȾ#wŀ-Gلa}kvC+g/~^{Z$?\eI1o]D^;?гoC:?[3<|_ɔ8Xg+ߺ*b:k%ft%Jnv~誌~Oi6zam5W0ZoLjn9B[y F Љ{ 0J rqAg: 2ԞCw,EQtj:oGHrEz((Fsj㚹'-WzH琔լgߺmR } 儝Û k7|?d%?Zڄe '\PMLZ-6f1рHwuD'c ib0[mx۠HlďM@D Dj%4xo'AM>23McG:2pu +c Jdd<1O+T;kINCOOP#1y,Թ9;`?ÃN,!Ac,ڼIm[ed䆝X'D1j1Vr| ?LAqXfjBomʜ 7 nžG҄;iٷY<^C<˓w y͇)&|̟hN+|#mlC^oC7}b-~K4Y UɶWK͆xCyw7DEqh_ \ ut,åiZc۸F jsvPj@@!}K_z'tLaQVc*IL) (0YR BwLWsԃ+ѻiC@0bԀ|kIjYq .U-ijF\Q؛%@V4߸woiƁA3 'D-vSf$/Vf jbp=KHs|~4\2cܭ㢤Rֶ&` nd|SFS]t1Ƥftu*[8F;W\[ed\kFc g8P |Q0f6/VxH§Gp\Q'C[nQѫ90Tvz+pڙ+ؼiNҩfaE"QQE%(r1Ԑ^J+R؇Uh*P |nxWKdS8?([J/jaLQW &ޱqK-dhfФdDqN4Fd%S:nya--iG|iao<+潬wSW3FIz6ke|{O%,)3|$98H8I5 ߽lfG\ e;SE (I ɿc~6$}JT)lh#>ϝNꨀHw+oG?*$OlWl\ YWC uG U~zؑ^) u1ji%%"9c*$A0L# ̝6)|) \)hYrO2)mQ{"4+Ex- P?]U颱hK'S]QN2MM½督?f@`o0q/n` E9ChA Côolؘ]Ҝv 1:GZ.a1Վ+Xƺ)^tlU[%[ΜUsR)(:OT1-3sAʐuyBʐ&ii :q>dK! pj֯01t7Ʉz?O];>̍ Q>>b+u?y1t0bHH>'(kՊvYI9/ c:ț}'╥bi_U'0,ѻ\A^`w#?+@G)nMnլsӆ'1^1#̍& ;[<~M"`K*o C[b{ ䷙m7Qw N% -G"m;YHOJ;L8@olCB%Sh4@ɿ>j 扡(q63Jtjrb&Bjcۥ8"?+6c<}w0qRx7(-Ismf ,]Ψlb=D[oҮ|{X`=jx'O3Okڸ KbEѝǐg24.I*a)]HP1e:7IzqvF)x-1EB'.^^Q@wC<:uאgS3(dR.fn46$CޯquRM<8y+k#49O֪#$uf\WocԯD2ڲ DeE YuoxL@x<+:n@V)?-``$Z8WlQ555UFyt;fJf8 nO;Xh q3CC \F?_G!1FiD&/"5BAUvYy B< *@nf8GUgAO– 0 (@v!GƍǛ4/zr=`dch&A#cMZ<<Օd!]4۸ҥ҉Qtb*֚V9 I81}Z2yԜD}:^,wE<$-=T+V%9#,sKJ$WJ iOV6fY?И(PyShcBFع Fw s{Ȇ@\~!.ơSa?Q.tQ+h)װ1#Z>ec͸"N]y?NQ7ޗ^gl(ȃ؜~ؘv14mnm lm>17fĒƎ3 Y#G*{cG(uwR23ڶ9a&Mؔ hᎁM)6~x1`sf+2@i;`۱rFhʬ/Y?:QVIMqvC;_^'kPhxfrB$﮵CWFQC@,~ fN;ṧ*L_p\x`aj ɘ\q(dc&р.kQ:Y\":eTx5֖'Z7w!!&E, ZAm:!hN8l#]TzFrN}# j+׍HXHrs^! }úp(h%r54iG"BDcdGjk(4&É3񓤨C8jO''z죢sSi,* G:ž6 WDܜe CLnt;[ <{ EŠji\d]ﲔlxYWg8tX x(r@2Icq7F@ѐ&3킼Oɂ'  9 !Sb/FLb>k12ţtT"{ӚH b\i/+u=&eI%N.QeHvANhѝ $:I $*% q<Iϯq/WBp_`PmNb%YN+يN, ͔2;"Vőn@ioPs˞Ώ9k" LSY^к8Ӥؿ9\F-~>B:Lw nH_[oUOe74>Q@_L6fmRQٹ :<J;,0+M`wD)9O[- |cy5!6nQ>&xf" О "L x Lo8$6%fa+4  ϴlDX[;`Ne'xTqkl\y,;`z03')'qY-=nu*x%yy z^eOSP$|zmTt&SHM;'Dې67"θ]UlI/5N9f4t8S .$q?\A%Kfjl=cìdJ30& v?֙#w|q?G,+'cb.Z$NeM DGME= q5{x&;+ODwc|m%MŶDefj2Vxm" #RsjLAm<WH qB W ֕Q'G;ZK*QrwH^ <`;-t-s \ŚQMh0+{FwUt|>oM a=j*q'nUқGE($<[VHbQQju/(ހޟY:, \ YLK>[$Z1֒zoMj(Iʁ0^d4 v_4D/eQUI, dާUz̀."4kX+ㆤRL7mtgׁz$`} T5zDCȾCf&Џ|*zO)W-pϋ aLI3;}/׏~Ϳob?tK?Ϯ `v "w<(a{%B+ml&15 %3}kդjw ~s1 Q@lM=Sm=e˛(c^I%*=w,G\%"\G.dCua5Uc̵82J\T#\_+Z۷0ۦ0O\uB%kLkv~%fѣ%D^9aOvݍs3܊dj{IKkMe}7 7hY5$tYmV4DOUV›v5֤&9`&$E-$*7Oe( "_U_i;\./彤(|ZW /:JFaQKqǙVA9 !ߎ/7]596f/\H_"x!X[<1^zZ:筥6uso{Œbz_CLc>WzSᵃ.ع~'|E 4>.[c&Z"ql:wwBP&.hv lK5VVczXShQ*BftN$*퇓ǂ;{O ~[A7zZn]%n F?[@fxZ.BšWXrBL*btp߯J$X$  6MKcF#B>cMruZmay1x$ )b\^z H:Cl&{,N >ln=gшcשsLլ'"? 4?zXY𚓎ϢI!%M)VZȹϧ "|g&INa7P~ƒ.Cgz=f3Xd9@ Ff;'}3+4{]za8[?\aX\[ ?6к7|CF}Y`*=C)Nدճ۴al)+_e]5#b{KM(-xj8('~^S#әU* a/`fTc$O[mX= FTh-HsT]~ Rx |$OcKSGS8UEYZpzh?+HF B=GwL߯2؃,r? sЀA NnЈמrz))28iA γ/뤟#.r ٔ-"#Do72, D//,V ؙJIΨFLkSs`3oSIs[zhlZѰRU1g$ GgM;I3etw%'{cp=:TЗUVVЉNJuyhEg-Eu2(Y3ac:F/_${-~ LJ(?V+<~CAE`w9jրnT^.XJ};>-ֈDcu9jS xffh[[N1R|+wco6K]n e:z*_R2p`4ZLZ>Jw 6[E_#b(~ɝ6tEy@m:Djb*U-3E#M_,)tb/ E4c.w4j#1/J~nj.teH([<]݈B+ ʙĶ9x=*eJՉ2pZ"K4[O̺T!bJxSv}Ů8ˮǜ}9x];~4̷})a$K=fu&wj77MxkjlUϏ2^T\A#!I@!,`y?0Ujg#9#L JƜ_{^q }RO,V5k%`>pM>zq ;~xWY(hJ[ pID{2rT PʮE~B{w1Vsu!YN#{k֜Xx[Nnʢuɔi{Q{f\;C2,~%2r͇ hbUcC5]C}up{ۨ5 ݘ[EYT!>4-FVK_b6/  E^LX+{t261U1k Cmi f0<\gvG0nx edɝ|j%]sA?l0W!Бԙ?J" ζҶ@.X~-SPg{qjbB8IN8>[7΁`Bdh[-B=R$d,q: F7Dvo<~>R1ފBR3 7dF[& (q)9#mB01UlF>KyDzc14r LLGiXh/MA|Ez_76ERϫ/" "k(ʎRX$8_pRJA;*`}#@=+>85T9:F}C͚եl' ht>k|t<K5"Uڶr3?botM'}F~y iB.LSrYe)rZA}oͲ߅R|e-$jМ-T9'̯Ja%מ,rTkOg"s~'\%uw]9 umC P䦆(p7,Z*dec6 D ˠ1!k=G{-")@sU`(ĉwRne?jq۫d[ED󍻅 l;OgI),\+g̈́3po: ET j=C|LLtm)"TPvɭ`ko[H AHJ4/KӲvȮ4 sr;lMk|7Τ f2!ٓCMw[S"v+2wKfEPNPlg8Hߩ+yxiݜǻZqZ0<%Gȏ,|#ᝰp{P&s:l" !P=)l'R'=0-3Gǐj^YIBv:S{9 H0&Gos " ;%Ot]کRk~- 5I[f ひV5nnRV`>m.O/5Q ݭF Iթ2~4륫~!N x4 چrWc]-சR'be60o5N#JnH:ғ/G>'qKHòM\|Ou:H՘ bo: n&as+-տV_*$8m(IwN6d=Xm~)z9wd^`N2A%rbt͡gi=\8x`Okj ]PCԺChVDIȣ$J_J/ V^&7Rp U3}jC HӾA@gɺ !уRy ezSgUL/} *0(~@f_GCUn5i+(aj,%tק'/ hSX[IӬ9R=P=j pN׺ڃsKo7"-Tmzu2>^Hwcwkap״3suWo_ԗj/NbB߸p&FN;Lhw~Lӹ a'iA2]ֺ2MRt~{~f:X}J:E8,;F3v(ʌYzQȊIhjkkX  [ ̕= B>n(CY,Nj}K8c4o pb$٣派݈z_2}0 Qʀ鞕6%W! FG !t $Krbh ݠor!ݪoX@h&L4& S֎9$W;5.H4ڳ{o )#5?uTQJLb\[+M:E&&g?H$@G6ڻk!e+SPk} f+E3TP X*Idȿ^y[=hE}P㴋zIˈ567gOSbFXI.{kVз= *lAt&&}Tm;rF⊣CpB^aj۴MCOY:o|3F -RL/GDkdȕh`3q93)Dtnm|* )*Xc '~E|mnAUf(8Cu ("(_G۰/y`frfWP2uyӾ 忔9b.]tC ҷSQcN7yjhZ6-4=BBnۜO'\{YTo}5ݐ_ +YۙmӌJu(Q'0ಓT,Q. )M ip64#^}`K]<Ѳq_GNFK@Ef.(tZ  Bc2^hZUIYǘZlꈁCU[BR1NPrVp+-7U*5ˑ҅bOgU~$ŤhSZߎ istϛ8!@|s.VUy*e|)Z _ c]]T0ܵhKE!}^R4\6I7'g7(NlSΒHB_Vzc2k&㠤2lPJjG._X;ıJoƬO.Dڐ AZ0+9O~;r3I[PA)3w-TDxEqj#|g&ʤ\#oۮt:IRC@>@`Sc9 E WS,a0Db%KS N#JTorcINknu9P舵o. 9V6T$duV I/J<~) " Pf+d3;T$ˆF0ݻ!yi&z]`dڴI꧙y; /N҅&p"J !Oh(2^uo %yζtnDZH\thNn[qI6mxvpyXy 4`(j)Ra'lAfֿ}TG'jOZ\KQOW ~ 2 }J\TwF4`\nC_5;ptp$ex?ڋAbr KaJ2gAZj|Ll,G5rpM̲k5dme}l ,"`-zgptH'۷ވBpP\o.6?W%t+>IM3S Z&9Z_йHkj#m3ƥǙ% .MߕLRAs@h,hqPvꠍp}FZ /q+/يI| TKPm) ן<Fu{uvRc+_m :0yPs./4zs:qW(GR8@!kFǺ+79,.:OP?ŬaWi\83njO5۫Βı?=q8`h̯ ΋s)PSFX7Pm UEBOr@'-vzaS2wz%9;ՄP >S},l3] pɭJh={2??ؠsT03pѡ&q3 4ikWg}*:H;9#3ϒsq =Ÿ0܅ȕI`P?[mľ-%`Xp;I-xm)~Rk**fq {"86thP E,F[c>EAH.h!H0߰Fo{ 3 Ѡ/QG1}jI6R+sGVn\at&>uɼStxqcҽSjSK:cXc{խb/ЗeÌ` \Ls+\T_WxD+,\jS+jߙtA@/.S['UuG5s'ˍZl. OEm%وc&y<:0`No: jN;謹-WDŽ'Z%wr0^t-m"4.o`mn;^T1o)g[W<ëe7|j' ]Iu2j֯Ooف54zcj}zbV q!uVqeR5@]9Xrì%#iL;M4 g;pUvAmF)'vⰄ͗g+jV`RR`;33 k2*[oC"P(ȡ*!Qyo},  n -x ^U͍FKmYZ%:>ћkoD;p9` cDHg*3@NHgZAD[ЫvZi¼UMNV@\zٻQAؑv?M(W >9eท?Qf{ހC^Zv?Wy8 +JWQV􊘕dp&Up͌' >y/*w'iu U%ρ!iƀsk<`r.ϕ1&ۙFyqjMwrjUb>0!pc{.G4ms^s7iK\ 2V_P҂w)Ǻ(yO>4 !ti\`P(PƉFpd.&%9&n*+n܌{FOjBI*i{!QerYѽrJsk D,1|֑ʡR6ǐLJn6`B$PciJyiCl`}˯)t?tp+猁f.0#ihx2%(hR_֌rQYfg"7x0q-D*Qj% vD GOqo[8ykS=ոEJ,Յŀ3zsq-`s+d;P$?o|z~ϒ]}>JsuBYi.ndE\[1Qߙ>KzމvJ& ϹՂa(X#sVRfdEn1G>Y{2ՆYn}o>;= [ +JQ뻁!G>ުLTiYٹX),ޡtB:H1n]O.FF_*J#& %ZyƳ͍PtkQ`q-3Y{Ty ڤ֛=sv)O,u-2""&p6pByD'wˡh{ ֜EƕgMߺ}&Y )³21~[:~,`%$&vN۶iuߦ#E:A?[/ؙ}$MG^Y&rAuOu'T<F8&r߷2YMzSh(bәo/@ hխG~,nK$@Ի.z;QeӨi!"J7#\ 7]4h>dpYeЦ+VІfV/0NXԘ&I-@W'e5HGGtS(rf@~]bVEnl:0s>1^AA¤@=B{Myb%Y& 7ݭo 8/׆qO  i2)4_jc֜$P|V%Z zS[)j`˝(Ð!cFnBܪZ"[qf6f.YqB{?tkF ފZ.{/1L"x8Wόis^Uw0@˨x``,e=!\o8VN9B"[ĪԐ{J*` >?u,W͊)_ŵ7^,_}cMPHts񎅑XiAYs17f( 0fW[fȔ JjuReVL*|+r'71z"IՓDTwۥLҍ0IlcNKy(Q1MѶZ#f*ٸ`LٶHz6 =gmJ>qaơ"3b%/di(0, 6N ,pGlkn2aiJ-MڃyP[_B[Z$8K6,. DC4asP:H.gمW G3z)mӘJQ+#}!{x2ɪs7@H=n' c=ĸ:6>&;j@MuPh\ȶΐÚ_0i"OJQ9/-_]0dV%M _D0;2ѽE~2:a6DqBZ 2a{(:<Г4l$3U54MiZԻCVAl|9 bm:6Nm:RgG 8}8E7hgmE/C'ް52N6aH yE|<L#}D6GiDԐ8k}iNw rȚЌs'(Br&H飏a< ];s2gM6х11=Yfng5< 813 kBjJT#ț8ȉ:3/lwȖ"jԄ#Q5?%jlUΩJ/ZFI<3 s.]Ǜ<"g|1㎫B9!n%`L8W#F[cwPN=N~DqJnaQ/d#p2"۟D0tY}2q>{|:uEqmUfC֍4)N-Z,N0}G7:z=!r U?Zto;'!* pP%`r([oէtԦQ~5q/.ުNAhށ} ^%%,svf8zS@J=`u7"+^*ⅪbAll4a5p2=BVB?#i[Av) QG(p>( ;$b 6o!Y26zýJ鱩v e=(e-TknƧں>Bת0@:ʌ :Q3q|*Zh:qfߤ͐GON!?yG g\jS#nLD?UTM [ֆk:RF/LL+\_JXGw<'MˠmqþL:e㌉N3vn|-dc%ŽM _-w#0F]>*nj+*8^&] MAsŅȗ+_-Ki-;³O;z u @&7wUIZLay"w?Wf|(!x0KnjLHeHa^!]x:*VotdYC{KO<(+QNg[ 9wі{"y K T?x>ZF<ۂ=Z%Pp# o Zk^1 8Bd}).'x_ i|#LpbJ*_.$Ul+zLϱH3 h*Ð[P{ݐ>ɍl[oC%%7=8kmfs/X #Yȉցgۯ7D 2m=Jx)!ْk>8rE P}`P8CU A5Ie)_k}elKm/[>n?F:Yx#Ta39]f-hbH592o[6$J:m[\J[-5TZK6k F2JSWҾYo⿄Dݿ  ~=Jϗ=²̑ ARV'pTJZx Y;!60w4ĖwFZ!^\H"*68 =VC"r 6JԓHoZ|zZ!s)!!ɰZE3T.@5-Sg$ȿAMk;/(uBL)XNkםԚҐXlF?˂>*Z(o_]&9qžZ{af$sJ`B?hPs3"/Q {yUB& Vklg$'m0jj?ACX;Ɨ&;[sd2Dӧ0S44fM`+TKJQĀ( P O~^*J\jܘ795仟vHA 4jk x4Q4QQ ژ@"?p?jV*fj*/RŠWX$]ůqߏgQI׷2Vң2!?H,bTOT[{pxtL^G$vZlЌfYzLM,#<0mB~S'JC#~_":)s\}-LLK񣝰HxWHOnNz&YU3DojDa+,+^pDJ.2k!cV˯_P?; EQI%GO==I_%(A tЉi3,`];D{0ZlsOjhz,xT/cgD}|p&ssCy}ZVk(*!^Εnq݊)쬺g,>?(Ur"|QCohl[tf*TC,dݰ}(AţuaP,)?-ϊ qp`^ =M`G#'ͦ ~ g`ȫQr"n"\(S(b*8i $1'NOha\uvs[u)Áz߾$BΖ+$mH9J\4 j韋F`!|{tHK!jXHC-<_+՞gA4o@ bݓ$}7''pQbOz'6JЂIVFLAJ{>lE3Xc\IWegՁEw"xud8J|X5b K6uC2/nTZcXImM1! |{^_&;Qv}DȽ.l"yT,;.ܒI.tQh!W ϏQ,rhtx@p4fpvǚKlqT_x`qd"@PrQrQdܚh^84}/\!_,lƄesDlԬL)}45(Ļ_bA%ٙ.<e|HŀcfXXHԅ8>5m("](@u"|B#y?sO?u_0Dђٟ /7(eQd$kL cm0276=繨{~v l2RFbF.@Tb8;lXF$ MW\z)*iXx Mw06߅W&7l 샵]M E3!h9-L,n_hU"SqvTuٲMNm(MSTQPD IܟW0Kfn3jM hZsy$-gtk80AL jjICV8DAr|!*!KAш78y%[OC콘x ҟc}7?aUTe x6;0LSU.pRY `oggL?= >ciJtVV?@ɽ(1tcҞ78 UFrqE^(07ǥt59Qa l-^V 8KlݭS_DXzqEdTSbȒV iމ/\_n_n_oP`$GQo,`qzb(IEh)煠O|1&j42೑0[Cl`b "tbO=`)Ϯ1e#9.I_ X%} ;ٸ PzF 8䝺Bo`@uhDםD,q:Rz GNzLN4TVe%:}@ R#jJ"}3A%pU}v;>nx1IoQe;XNSVbKeM%:sb>`qliװP$~[\>v}Gn' euInlCp1kmU?w>N3[bR0ZbsIrAvfMf4`dX^ݯM~Cݒ;1 0`44';&">3dKub<$Ix5jy8΄|EҴe'Z(?Pʙ h?;8_iOD]ℂ|lh@8 @&dP WY:ڞb?|`glnBTx9ng;e?iYcq?[6e[<Hu 1<:a3$ADVT h$:0mfV[]ٕLq9 4D"GV2Ga,D L=R ~m@b;[}M?QWary%!o+fqv]!}RC :"i _E,BH0v'bz:0uc{9 C41XfA~9Gr};lDen>YHɈ06Znv|՗ŅžhoL\QMׅdՒMlhL2e0.x[_֘[ "'r T c;I S2DҮ*I`% ޙՓ߽/l#i&C~UZa!A ARS _me|Js&P:yjmNn☒D|b\yPO{.y)fhxX~"گd/arF۹vbP4t#U0 Z4 2~필^ pWXA  ' ui(K ?tZi{ p, 'Ӣ!~j"BeH4$3}oV縣2{M,&E"_~%@,) !/L /0e?xSNl2Z SmA{s-Jԥ;" ^LBVFr“&g_=2V 8$xpo,ͻ9mmSR(\x洶+w z_J1~Z"ӯ/[ge#8/Z&L. @ץbiݩ;h@[eyB )2p4Y|1E`3Iz[+CBw*x '83ʺ8x3| 0fՐ+UVcZtoaog;X+!Po[$]>t #0.ѡB^'ш| LƂKQ!oWr͌U:],v&G8WV=8MܓaTB4-?]5'at>^ V c1&TfߒMYrQ!621./KŒ'澁 ]e?0Ӊͧ ; HTLx0C糺czWVuXpm°D st=BK~5ҌU+]pJ X|Cum[X$,wwÀ21P J":i]96p %ݵnNT@piWzS-ͶT.gV'YA(5K.(KU{4s I9sK.7a\JqJD NnG% ^ĆtE0yĈ͑q)cC/݃VZKh{ Xq[w;z 9-拒 8UYKX6t). p~ 1YZ0|< HTcQadX Mwэ]GB~>U:*'U B225x- Kcec' ķ#w5S{jq;boiВٌ$=Cve(f}\뾂qs(W-lD}S%C^$#UaK]{.N SWE<6֚nh&>>pK^+WJ n\<\|3wV+נB:1 0kdVhXkYyxk 'DKW5tZcA\qI<Óa,)"Ш3ȸ.i4$ij ab#zFoON)w1NCm:isG _]~҆Z,c KWBcȋ&!a }WI]0@:yE0Pǁ`._i"UokB8.6"H{M*N4 ZYhQ `S_2/L15acy34\[vptL1  L<&^LV|.Oo'C`o:sniKXj$̐a Zʧ)"w%~r(^jOrs5~z|"'fyͤD8d7!)DijbO9r9):,AߺnRu\/VFu|nj:Cr(极ԑ 'sy4z6&1m* 3Plofj2砒ŧZ+Z Zu6>1W@ҁ#,Q%Һ$pV*ʼn#aZܴ kRz3MO!O&Eh- wMCKR 4}tf ]x ;\}tH}Q:^~a [",TtGZm" ,(?.$؆)鏑IrG2IC ՆAD 8J}x{l\ ڏ ^3R6<+Rs !-M諘,aތl;Yap)JL"[͘4ny$Gtt9]>rYm 6eoMRnrYrAhɫ=P.wgly`F]51bM\`>s7Z2q_aC>](kGi;TPl9{i$V7ZV"z;ɫy AQgKRWrY_ O보os!hʲ3f. jzuzyC&x'2=/PHœ2c{dWZ .;h Z~7 _L㼧?'J%틅WB&w6R99A}rnsǬ D09ղވʳnF}d30eV{`O56ǁ&8A:g W2% 996?r?4 O;Z)/`XRc},E <.بk $uRl.05iVx˗'Nh/[Ķ5!ZEe*Lz`<@_QeBreVBT/ Gl~| d<}F40YH@=(]. 2nvl@  NPf<@lR:\yR#j,!lÇbPFj07yV .0ZKgs(7Dg0$d5Tv cth]z폤H;[kә,O*?ޭU Ÿpb;_^s"}nj mMꆜ~N3`68RK\GO5GD0܇{)t"*4Sx+}}A>+e>r>4@rh[ 0qwӊ .J4JS+bϭDpH/KE[([>1 a\8cP! !H\*vH7f=U6׮mC9Кy%[f y7+D˹UGQu^vfKB7`=u3|WngoRgOInpF|(#]grg=_Gv F!(x8c5*~ʕxoHWB<”쥈~T`O~4C`K4jsC!D6j Xө394\VZ` Y9j"= % d޽;bp :%n4B^o#Z y+3޸"MCf%3x[+Vy%@!%ʕh8s_PJ͋ӳ&ҥc];] >z Yw-^.m]uDݒA"NӠcJ&m׋\17.^.ZϤ'Aw!|:sqX:ӾԐ8)T1H5_ /$zY##w4xP{@p1֮>;?y{;J}<֍ ^pOpCRaެ PCV K8ڞkZ]E\7nk&OM[Eֆ][B)qҊ')HPZɫYnHbw(sւ0D(ֶ 7](L_K_zTdqONNe ?`\pZ7n\=:vZ6f-H+qʂAXG",T(%4Nӥ (%:\,~ cpw=2ԅ%(+&p[bgz֥INaD#@=>fDR^dlx¢ݺYʣHH3GO,q;iTgvsNMoVy {m7ܱƪ } %Y$ޔ=rysgpiN]"'= EhI+yZ<B1FrW0+Uu1RFdhP>zGuVKD8>l Wm`,|4`XV"?OPQڋ3 m|ȋY['"8 |N ԸwEQD?2cdA dWn3Lt>d (˕UișqZp'pwA#?>\?eؐ>}TI ˮm ZSOζS46}V&Ѿγp*źw]-҃aF*ҳc-b|g2.==|: IcnfeƱgR̿n0IgKg44ڍI3b@אWyZ;A:Yid*!:j|4D0dɞ08fT^4Ů/2U|-7f^DNF8ǝq{`0fm,vIO7K4 ~}qf@HY2;<V2n}zY [fCѲ0Ϻ'5.0V9ű4(R.Bj[̯ZhF 4lje߈1S4IAzUYwB2Fa}(JoTW~lts(hZX1OG%h4q1ο@o$uJXK*q&a ZW,r>l5GŝZ<7-؏^*C hy<;,ԑM{8VН25vN$hH2qlg O"8RQS7< .vnr_P@3]&踦 VO ͊F_=eDZh(cg3Mc-2mm͔aXfgܙKE#.CV%v˽Ӄʌ$\} ۳mKV_:>p@Q Νo/IHdEF(Zq]s^Y!pYp{KEi[Rvﻢg`x-ھB$r(2k)oYVH'Fbo ~"zgtjWw,3iX&:<>DWar0ENچIfMpZv-k@JmaL[/Eښ/-]މ#ҌLڀ22?$Mf?Ruq\6u"B*u94b SA-5IO󢮙)VKw? #MCfm,8.8xJ}p+\xάԸh.Og[)7zΪD`+ ȑoB"ebĖ B<3c aƒG%oqRl:ZP˶c-FOVҥ;-h4 C*ۻ>Z, eSح4Z >eq9y+s%'kVgĒh9R3mhr!-O%浍T_pQm`7dαI޼ !&H^v ϴщ Ps~B>)>|L080dmĦ+ #4P-DZ`L-~.SUe3Am%t4*¿M#^ V$m 4jl .V޽t9={CbՋ"Y};cd] >41Ҩ;YV >_: DVo5?\'lo"OF&^uAϱ6qN@QI(fG#^80N#p@t$9$ 5 %&/ݎqvʼnc$;lz[ t6sؼX2榭g]8}=, 1_+朻0*uɨU-ūӨ]D=UCv/{k/fJ.l@:ZP˶d%lV=Hr Y]ZL>wy{HTr((YS #$n"#W^ L> mS+o5Ujֺ/dڋFOW[rok; [ꭲH ,M7Lb8FYlqL1v,bb0BѤGm>Jo;"r:kMCLJ`*;S}VrTP ,E_PƦyf!P:04(fW ۞M_z-g0.,,<ƆH AZ]8o:*L(d|IdOF*]!.M.\f?DިּwJ)}QCB ;Y+  NYz:a˜7hz>dY*H~Š1Tmp?y,*cJ\9ޤ!2&CjDTf3g~9 )5H =[(e`8:AX("zsRO)Ez/040H]Hw{f(`>[yw7bxFUW s/$KGy}"{R,}p訔vlk?9j|e ;3m# ^L=ar/PufR&j| M vJ}~U9Jo_(QJ)58AUH+T,,WBD@{Q"c`mqdRwM]*bB[N".IG傹 vqY`TӇ¤› JGeR$Uhb'%Z\蜢LAO aa;X+ ͠ @5XMO*Ō Xs/dW.jh'El&ĚGUC.vՁYr3X +l ۹Rө?@m%X> \Qp8W/BbcWTr(˟BF')"o,y_qQ"l;}&~~[A0Q&+08مH_|ag}ʳzE3A7sX&}j>p?cr*,4osg?&~rUޘVѾ:K-k, 7 B2  #m?֮^2;bie%R# &o,g~r?8KzTqܩ1OևYL4rNvlR!dpj*PAk4W)wS5\Io-n&!-X`r p&L R >ga@AD`5R辱Xmd=::7(W)Cfj|УMl򰖿ԮݭaN'rx yZvWHEfdď@iU>kcp>%xCf0*a_HYSbt!@ZPTܷRϵqSqJ{gIε'Q?MbBanͦh=~T[\v¹A!V_@bҠ֯&pw̋^zEd)t6d&Kf9>@$D3s'ș ݁:5] 1FT)%hTeL^i&407(Kj(=洛+N5Q: JQ`:*[1HZ/*~v@kI~*z҃=YքAI)nZgY1+QذҰn_k%ޫ УLj/* lb* ;u\XɲIr7!&Sʉ00TG &[kP)[}/ȶBǵ;]_&MG@lOyI{gVTӺa>,(}QF}nk3W%x'4XuuלcOp 2H(M/3ۂkT֨X8WœqOl1[ fuh~+ r'?uKS5R=?Q']mU7gw)k Vj,HE5STE9/Yjk=aro/5:'cr`}5fy w'戶Ͼv||eEmQ;=s;Q&EHyo鎔ϟFMnH-Y0癕K;B>+X S麦gJ+;} f0 .&\9v@_]h!Ż|)F夥SՊ/*rn= 5zV]%Vx>^F d{_7uuh˰N!H^Y! cFhC%>x6 fC󟮈\G$`rg9wK;9rzK=(&bLXFZY @8ݿZ{ `5k98O0yKKpD5%rOr:d}' Vt.(!:y, eD8"1O&S+gorŤ )ynF5Lӑv,Rp:GVǮP$?/g?օG4,M pZ $&[8<nt cKa02+'}5AUA߻s ƲnpLR2/{/vˢ_LK$B#{]Y6]BDŽũL%tJ(ҋeA}K @L1a_ &<եI;p]HX")ډ☉wᐒl B|=|), J'IB@Vg9NN^\e=zcWh7c92Rp`ǂW!,R|3B#) ScP!x7BHv-y8injN)LNiiZHsT!ز޲q+;;?ދZ2p'U=r[V E7!xH3H2K쫃5|Q%n_ #SX"6]Q|R4np柘P\~ ~u5͖G֓Y{+ t:iC7ֿk,rds~.`< wGu.Sb&\{G;F86 4oqc5+VqS5Ax<% $nS]?K|s-]41xbPl `yKBrj3fWYE5}>V|R#q*F>d"?#xUC-Q|Is8Fg 2 4\JtEWf%O9kG ?ؿV|~c¥=K>ad"Q?zz+ւOqa c[?!ƺUR]ĀLڞX(, $XC; ^(MgoE&]KSf[gہ$RA6`s) k>x`g [27K,ٝoG<卵H@C3tB/<%h;GD~7d\>jM(*;p_rCe_Y׀&7]OGߓa q;Rr9]z*LJ.0r+.uv^?o/JS5(gD솄 8!0'/ȫcr\׈Ou`o2/9ྪMt=V_ʏ72BB;?$ӝ3vˊ4CAYNNҫTBYS`gl^+&Qu#&jSrA?B.%5'(;TiSWr[gk-j [(Iꇰ,96+r,e/x>jYgd}[1=q_)PET*DySA?HtӒy[W iQgj<65ZhҨj4v} W *v)` #MDt`c  :,S]^ /f|/fWJj;7&"l@oQ.X\HȹoA̤gz>ņ$⸨/@f:ˆ"O0[N,..X rG?oWK}aG_DN噹%F{7:qu=d,B)8dok(K, })osS!muc;Љق<8 /f=tr-QP[- ڽSV8˜ &E~k0'jU0`w,6zЩrԱNeBS=&QB܍*!K08JA"x1Pru`jfP.8=nU[g{ޗEw3*q٩Э{8'ҝV w3#ObԭPYKڪWJI p>k/XC^ ['8*ೖLF ȾN7𷅐\C0`|}8 l10RisúJ|ˉ8{@+f8|9*dyu;$_o,ϳol>]JĬ>n7uIY?Oܱ[X u ޚF' 7|{x7K_b(A5mwVai#zC kMۏ:IK@Fх`8p "-bg߾u5{^ [iR,9,..sH 4f4űH AM- 󭪟IBJTg%. #%nE6JF1P=WMrːF,8;}ܒQgk,\4c̡Cc^U;9Ogx?,JҠWC$q,Qoy{ۈ``(pda}uCPf8rԧ x-Gɑ֛io=ԾhswOO1?4.*"LV_Dzqe8/RdЖY4."qK)&7㜔ޙADm)F7ϭ:Alojw.0#As 9څZ *jƚml3%i,MY={ӱ,Ⱦlmj3_1"T}>H.jRX3n#kᶝ,Oٶ{5 +k}q21kR(MR`ȫtusx/pv9rΡ3\ͅ.vT5r# OǣcjԔ$7IbSeDyVßMݸ ǬF|irGnw=ڜP$k6]S +S:[L7MVy=s\~GfcGv|dznzI)^rȌF: tl;E5zHAZץ6q/!u`e-v.5:d~ҿE rhn#<ٗ`7a37A:~{وՄ| ?|P5rp/=Ғb}Q ئ:[BbFx%@@#GfN{(xAQZK&ŇP!!.q#]}"_ 5:A m2)cLZjpէDd<H1 IK"eYV'w$9PrK+MR|E=7ӑ8[YQ-u˩ԙk4 pHy(jGS^_F-"-6л,c8uk2Xip&j?Xki=oyV='>EEo>p"޴#yDll-*''u@Yy:Z.`ո0KwW !u /@v춖P;LAjk&9cs1O{-]Da mP"q^|mcl3Rs\#zz@ TPD7Aă:So&5RSNJԉ@p!&>TV`ĩpbE*'> fE*wyG_SOacJ/8$+F!=WKg,$g"H-=,41S"DGhm"GgZ<hWP1+ j:v+܌d2 4mg^mj~XB/wz^˦E4 04Sl%Y[k]5(Oqwɑ$,x0^ѶQtxU^6c{˼Ib"kMI(=8TݐDsVj>^ `a}N/ۚ~,CBNKHz^?2./]m:v9E1vF~eNߜWthq@L$2&n(6ⱻ'g#! U7Ra0BW[;7Pf")TQqvV팖.\[+%yh%XrW,%>lHz(jf o5^3PQvW#nϋJהT8ԕ S # OD{#U8I,Şk*Vǚg>YQ\5@wA; QIUb8s ]4X3n0(Z clNs5pTKmbX$H$_(ΙZ ɓƋ iD34u" &(6"!_0XfתUx e`(%(3qP>šȔc0%u^UI\n $%h$h:TZ(\FkRK҉x֔un/`1'_g8I'?(2()0Au6!]L *K]$YLI9FRa@T0C-3'XzD`t[_MIҥSBz+bޱʟ][{d~ ~a g7ozK5}Б8RD O(Qhu:?@^vK?Ee7C\Ɗ6~BQ32bMI'Vm*Hט# $/xaт,Ae@5Bt$0پD#mC.LOzfcG$eOy\tY튄}7=m /`1n 3 CoZb.",Ei.ma4n bETޕ362<揋}̸?pw~L ٰE9񓋰yxvm,5W \^}8,2*ę!jօ*Z9 l'.ρ$_OdSI/ <" hTu}h됥=iJʯCr dFI2}vaޯm; ^:vmnnTf8E@2R(J^ %ov;4&?`î=m;r@_p).ά?׺EnӶjFϐy~i#2N{֣Sd(ͨ|N 1'.Z`Lo#w):FkiiUAH|LV9`nYh;7@wkQ2" d(Ix~GKւ }g:٬PIftT%0w_ hᐘo1r 8 f&V+Uo䪻pV^`(گ,%0TSnɽ};1j ΑF>j#,em5)ocs^6ZF\>dyش9]|AeH-mÝ@p}EqǶRϚo4ѦǣR*{w7%XE=ʕw%_|*."ha8#!n=G((6y v)7e!k-ᇅވdJBV~Y|]udZۋ8[+<#ޯ9W@lSF)m]D䊏`4~^AցK6!==r0;(r8O7ii/J!G>wb%ɰ'z̺t ttu'O! W ~4O2P8\r8GkXoC`qCP5g8 ƥW7<-jD SL7Cރ4(, ziۮOp;xi4SFrך|Oc岌w0:P2VB`G~ԍ!~:4幥C v|w>{O'K3R߉Z BC˸&$./;A^"&@F\1# EKtbڽy ̱8cY◔;dyr4`!nK9vjg b^GsMGt/aɶ9tCSz ?/a—Qe9zyw7nDK$8>B.FBaoe?/tM> Ag`BZ|xvf6/Ysdt5uIJXv-|J^y >U-LwP;PhI0Sy3l8X.hz&!I&K2MIhb@fg^ V1 b}-+tD:`fKDʌC5g\g^vW%_Z$O4!.07QPt3 %÷rqbpA!Y-6[0͏ ܼC/X!d3跈F4(򖯕;:;ă:mI [W=!Z8-M[b;ҏ,F؋f]\;ϖu aDiJ)VN) bȐp.@vBcLtf+㶚4{#"װOT"WfEQ yZ Z{B9)v$I/FΔ @ZOrغqLE"Fm= "sMyG:~8Kh;3^WO -2XC(ڻ}"~qtVN 6^(~ĿjLQ<𫎋p4Ay^ vcgkQ E:~3Mhǂ@y?cS~GӠQ0%f͸jNw6-^mXLIҎh>\_$vKwL4͒o0u;6+:[nܥDwj ?M w~-{#_Ժ2 txe LX*_:C`]i%Q՚qs>=60{6 (0v7:#=8\gP>&ވaF6<~JQ]h~BQ֑c `[Emr!Bd8+Q\ճ7cjO/ $SVĩaO^^mGv-HʸA*Ac9 +F5>aڪ1ꏡJ$[,iPj[5D\…ϑ_qLeUQg pC9.vT0JqS-nnO%9}kx*Z`OvH ۚ~=8oWf 6kflyh -F-3aqޘJAW/D|%wuUpxZzK\N6fd6^YflO,`z ZF36!a"~ŘWyw${00mS-Xm& D(m%/{ާ1_-{kFzj3h(}N9Rbn6H= ]|@ z\aXĝG6`.A`P4?t1*E^Xᮤ]K{0􎌨K#ʟ[/#2llo^J— J!ַ}p9, 9bsםIr Vgr6#ψk؀Gc^7๧:{=d,{cz$_ÅQG&4!bХN8]4:7#]y%&Tc>"@vR Cfb ;I˳kt(^wM*Rt\COÙ융w)8O(71DCF5nixՈSƦ>1Arr//E p2=* OyL0ؼ*~g1wΌW'pl, }?P߰Z}@T7d@6ykLT^;U({S>~r 9(fZY_ ]@ }pn<Md ) >wDrªSkG[oß5V@ψz_jڷZf 3|~ d> lk"|AGa뱡l $XEvd)j%u%<"X#7(EoWO(v͉zШ^u( 6BAص6[[a'CIT뱼1{$Lko+7!~ ?J3(ť )Ga<(|)8D@t%:7Ah_-f1b_9[1)˴:T׹}9h y',D#4:`K9l9'&^6&BJ =:Ro)\ױN?EG~j?l, Qͣ*O`۷5icad-keWCn2b`+4{WiAKKxKJ$%\ c|VڍpqWLߕ"skV<7O7xs. ]!gC+4~ۙ+{%O vqO`c8 ;G,_Y q XƦq1[8B uO r3tC_vA1C5 ՘aUN[E=H+ '?'XPn'\mz /Om: *#&0= \_đ|܇dwI'RPBIN/]M}Cf̺1Eu' _"צȭb1kKSv7)4?D@aFMV-4BB2Jy2d80 ۝Q?( 8 3Qim#up9Ug~,%`i,66SbP`|e˅UulGuYLןIK1dG/{т *77 ?sLr(v؆ҹm%R.CO1# s+Mx1mݭ(zXhljZ?njM=A_((5^ju$^iXdԃ6hebd?:ٌ?wiHq'م,)' 9\\S$Toh_T NLZn'cz3 U95͢d>ǚm81v3etC-W7LNVB/ ܣ5*#L CTaĠa,y0^ᇍ2bJ(o^Sw˟g݈)P_Wij.9# %p:Y>^}cyZ܈5MjuCYza~ǺƔꀱ(iCImq.bsN,@zr/S(q7&^&Glca8{+Оpkiz{}#z0C`5Fѻ?Q T~?d Slp*hp1,8?uYOIU-R`欓o"c't`.Th]}v[UhvXcQ'#}Ёr+g꫶keT100 Hޯ5 T3`%V[*qW:8CL0}{3m$ŖNGUC74رY@{my=9IthD9EK%0bxxc֏5 nT OaPgxœ!?!nSb9k>t 2?gy%b<~t"&fwHs[8ˌ go/l*FՀ_z,J[ȢwBtH,j6{c.{^0ѷ7}v2\PW'N# 'OFzOKv~E aR ="V` 6;kbܰ qQXluL,|EhfTlbD"|#΃6X +#5Aޒx]=涖T)^#rrFt|.rA h S݌<߻{2^h6۝/H˿4`6KS&^+ ϫujYqh?V̵cHv-=3b,L.uoBvٜoA%3XLE n]lsrf" iH(73C ZFLbN@ vᒁ>!PFZtwۼABs`$aa2'Z&L 0l!Հ.Z/Qȋ}Cl6Y⟌mm(m6NH C[,EA_}=̃&v cN޻0CR.ک 0|9̱ 3΋aNb䒇H~P {BK;4˦.~1wV$#4tRLF"qD%Y{˳S]':Ah2.&vc}ޠA"c@x aJ& W73e$voUY Y.]Q<^>i˴\䀧ƑhyCƖQ!%,(\u0DvC|,)Oidt(!nZpx}dW%SnΣEԐ_S@qv Sȋ"Y*=5jɈeXg)RoC&(< he"Io.ŦZ9uOI+ ,XLm!.Orn,(tGuf$/R^ŠULq VLj/dC~ mf/Ѓ.+xS\G1>XvMt’)"{]P![$ύѝa彸6 츬XĔ$Glh;=GI?@^'u_sT'DuGdf-<4Q$~xdg6Q}n\XKCE >?4a'0?#6~V?a`U"P:T_Y(n(gQ+DPCl3Źm$ v`b>w:w+돯]xӪ |e*@C$\`A)zV:]'UwiXYC$Wsdl0FDͳSO4ʔ65Cҭ$)veV 60ƻDǻ.WL\00|wn3z.X0(Ƞ:kA.;ɸ+sk[lmFFɚ((\3C>JCp Do!%=Znev7;ܽeEԍve}]Pv9|\:xԵ1.4J]AB*qSdp3VU_pW6g"GWÈRQMq8.1_2ZP1] %SE؟ k,VE6mݯ=ցUVe/z:\,A3Oo0~ﲯc,#(]Ղqu}ɇED9@wJۻS)2Grz\(H Fq$5Ha3Y 9^ GXiYL|\B=zc/!1/Ka d/ @nj]ˁ .3D=َf:[t49{hL. y>j5S\zt{-ŢR񷞁U|DLE5+ђ;%4 ڍ@ٱfZN4@2"rYo+E0Vj=t֨ Rь\Ϝ׋|sА\ֶh5 N@z5\ ]5b#(sNӲ'tS*ߪe0kcW~mirzѦ0蒒1fkӼL˅ g(dTA((:R=0)IZ&" xIj8ZAw2g{r=Lg&emu]VC\tCg&rg{aEj<[0C z0e5WG0@>sO{&!&ak1g~!բL{֨p܁#67hjv٪E4^R[1c;M%2HuQ=NWnc$"Z2i_K2u/ce= t̎ZHmzt ̇ȇ.噲۬"/lV.D= `Ӟ³ع3DPec$;԰㠁C|u)&[l1'md1t!hҍ;vNeٿ{OP -d&2SRpXSR`5.cμ%.Qي1DxsoE@^)|֞Z~?&*)˫}AiMˢJ=Jc_Q`fA+P]y{hA>>-ڵK3%~hz$~tR f| ~ E<^ Xiɾ L&|D}+/"ruXV_b5Y߮]i2(ra5%\I҄ .N.}%ӞB $t)fHn5ל֭M<|l+Y13;8T4ֵ)q+;Q2f m3wkx`IƸ<Ou;r*r){FJRSGvTz-*3)fmYgk-?(ylMP-gDjQ x6)&B0D6h2S(d0۾\X!?gPa|vHn[$媄x|#.3Cu/KyǪh ħm`Fw{|,`6^'4j]l7w`g Ɍ(S z@\8MeTcknQ&ԌZMOz*\ƚ!ns+Ehಳ|Km틲FX@a+b.JDATDTFJzpC;XeU[ 郖x1o#(F98\hpH:>} >{UtCzv|(OzY\.p!wsu8' N7BM4]yQK6A5z{Ρiw % U͎M+K:ڀĘ1UquOd<d| g }G,.%:{~FF )ٝW4wmJR\KB:pص?SB\̾O|1t)Ggs0+v{K]g:71i3Tez=3t@-춰:Q.ζ-d;C3M"rlSj6̕EG@zjERe@1_BYZ'8a2 胴b2/Le,?gR4b0EHLr׍mQuhHSN`(Zfx$T[`E xmZ`1;|>H;˳ړ^iVLFjH M&n?i&mūKQ0S>ٜ'ɠ$X=e5um_њgWKɛNDj^S4  Om3xEQ'IBD$oy>67x|tR>x@R˸ix9j4Ц$FPi goN<_-uP0 ōEE:WL.)0P:+n|IoZAxWZ:4 |̄:˨7"޽׬ETMޞHbIY k&skov -&c,d  nR-b5‚*x@t 7YTBl@>\C&=y/qUhjTguVpJMF蒗yKCF_3:G4H9 =#xV rS#?*^Jm_u=u5b;SpJH' d&%wi]AjГɸ p"pL5Wߋo;zԖQ7jɩr -]qruA,HI쨥h~he9{T*&5yB7b5>F.78Uk$oIi] VD/LB=P흅vKWRO]`w0dfJ WCy($V RiP7USѧ弩n, 's/qnФPrsBf~UdA TIL)v:Va!m\KܴdP軪GrW3s*%S?У"x$h,3fB)غBeĭeG݉9 6"Mk_L|JM3-(h2v616c$AkɆgGtwsl94An;߷8^QUN\ 0GwɤytMRV:7oi[<:`(D &\aTJ! \RQCNՕOsUQ?d-ŋ\rX,vJw,aWp_pE>!2jY. EnUŊ-a`h#~pkF>fLzp_>Ytbx"fMc1<rL uA '0w˜MtNry׋3Ubо0F-"Q4Ĺ +-ӈ֘dzt9\ EUƴ"=l$Urh&BJ{ޓdp7Ѵj ɫC',)zRIהWiэ3 M Z[xCS$5'q  O,,a:|+hqK[=gMsc>5a&$RQ*C>~+Oj `D9ݕ.*Dw!\)&nE^gS_z sdiܘ~EE]xl CGR |[9ox\L$?$mPAfIqJF613SŮY1O 9)d6ĝzE6K4J8yů` $dU'3F2hh^+Eb2 ==&0Q"z%Iہ~&<"{PkSThVirDo-<|+qprsECX-pxqSzOA&"q5ᆷ^F%i,w1m?EG|6Y Ph؟pVNحg (.K7_lL{ LskQü#V7VC$J0ʺDfxSzlzlaq Y|KHps9CeH)PǩW%I-F%[Ԋ0߿qh|[vAHiXQo %-T?DPP؝`@P7#1{[Jci\ObKcDEZBNp #rMDN.wsE>!4Rc5u֦lASLhXaA~E+A6*>0/}Kaz]dsP=92̂mFvxL`̞X=^T^$7L<OV9}f &F5_O1%m1TkCk+uδfư6#OW9 UK'D8 v"n:ZmAxXrGWj/n|@`t/Jk(MM[jArħ6,;xvd_EZztk|~&pG/uLT"RtW4.HTVm\~:dR:#f0KA[EOUo~Yd>n^ ; Madvj HjK訐(< ΁$ۏMڋ4a nH U'G"AH>߁.^\$YzBe97BBʻ~/Mfn:Wگ(Qc`a!Hʨpo2[a6{xPӘ`<*3 4 c2Qs¥O.ý^#pg{˿ tx.";qDIԳFV B|$WV~W&,0vyOVC]PjEF5;VNf ,zKhg}|+?W~p=|?җ.p!xZ={B\qmMi OSV\y~w/ =~i%y3}0b3I:5 \`[t3(f)A@6br>U"qK܎($aBKSOJFF )ٝXHQnlL&f/(X&y6:9cP]:.1b HKk2oTq(#pUPH{z&Y|0>XtFYT U l4ۤ]Ct\K +W˳]>b!n9I`lzC=tX6xlw̘ul.tسp"KKgG8?e 6$>h*RyD`靗s̴ trw`"c08L OpYWFz͟`B h<>q+۳ D!?B#ȗ}(KtDGSEѫï0yT=s ̪DHʅd5dfi*e ::q\th5¨2[㣰;SD`y$Ҧ4qO<쿇 )]Q7#d-L9}w0i 0qղ7tJ,Zn o9>|ÚW")M8 ٴ@bNP 9Yc]H+ǍvM qn'׸}[蹱k,~I~Y 9܈+u3ȈT m_ SQmT}Kɿ=offfVͣc-53I~)8"m;O74ŵNpFY3HY ŵKYj <`#z635z\}r~b{Q}̕ V_63FKmXp'so(e %`qż Pι: 87|"\idi}7NYi+o KB؜Ie37GtpV>F\ЈWZvt8KH!jOޡ=T bs {ñ_X8ăH"N5靆J>FFK}TQPM< (m*_3|(r4oTKg~-*TZx 8mƌ }aUqf{Y9pVUM vuC<9^ر"+R;'/o aGwS7< spLKXpH- DZGkg- ghsZu0;TI~H"K=VteT+e*f)b[.=}M.P R$&^0{!NL`r, (Q ec_YxdžL>&('(8Aa;4~>=Ĥq~OK0ݙbKsރkQOa%)޻y4y|O۾Z2ul +jaS,zZXIS9e86ҦPV+O2nx*5' (bNIm̀JtucBdYUQc/mڥ8u}4nX$y:H[. >]DH`i0( oUnMYZ k/-MX@jOReDo"-C@Hc " E opUsYF)e9_]ho_-pK=#6bS:J1Ws^Pt7Q'ۑ֚!@~N'Vhtx{w-hLe҅z+tzˋ$5ZUn ރ{ fV.:vT uĞOd?/26i Av$IB8أʟcSv yit6) ^g'R {ȏ-sIAOg'8_X!<ܣ+cpKy=hΌ 9eUjf475\;I` HLiɺ֊Ґ{ ;\Lo7golo a|W5YFF'vY~"FE1$KRX`;&`t g+^Rli_m f-$ӗG'*Y_E 1th*(I1e:1ɟɽΓCt[n9fp3|2Ԧ?I--6`Þc71v'zַDCo#?nx)9r5LenȶˠgPeX(ݚQp‰U%*h -#s aa} Co\oFvMNAqX֍bgS=3rTt99GKaRxVt*j`U1"`fAk%jl3W?T~6:ePփw59'AUJ/6r&] {iZ桛nZV']✟b0`Qx{[v^bP$5Ef \#烀)vjI=ڳQ8f'*f0OyKhd]RZ3\u^ ,7I8x뭽*YF˨ͩal )Y8k6ː2O}LF! wHㅸvnA;%߰B4| Ȳ%mƹřq$peEz@:Tn= n[.` eɖstg'.P1Ѐ͕S7m_cMn/qC*be'K`彼ĤU솆;Q n} ڔ/y A=X8M.\P䌣ջ=r$&nܭH}]gI. /ZkJ^=tlMʷз('#~Ei 0"[Fz0p#AmH3˂IƷZ.Lv l-%gD`CO r7{ zj]/lEA z֢\B~4E6=R0HԖm|\I9E*tO*F9ULSc("$_PPt@z(!2omS-I-DGLi4˂4mhQ毺\c}Ln7닧!ZqW1\l US +*Ҙaނ^DԹ:AuY_)&D-sWtÊs lgb 0=]6;$y'WQw*E }Z `-aޘگϺ$6zY1D1;'cP7"-NY[p&@Vt*athw_.f+qӇOlfl]qg#,˼Z";D7B$6v/H%+CmbPAV {RdY*bjX0 +T&9A>GV ;dM$NDZw`9r,>n"Zm˽iHVcJD܌3x%:QֵA}JYz7kY"͓}!'{f4'g7;nb]YY>:]1y('`$ ñrkbq\lL7<supXRH11# ZL'̌d|4Κ"Y΅/Ag')Rʣj{IF5>&z,@ͦpڟ>>З;R;D" Ms'xlT!gz G?Q¼|v% 1z"M@iUl,^IÛ\*==q#)Ӿ}u8ƛVY:hKق bاT q*De 0}z#y5T-a'mG d#;FpI,7/nA( 6 (d_+S{V%.Be@S8n\TNmݕc/ŚbեBX=7KGc WU[`L;8ѶaC8"0Hi!F;z!הha*:A jQjm/igFg߮$ǹN٤Dx<&0<@c44 27RswwuA Vrkdto-^[%Wyv8a$SgnV<.h!vT!7Mb8< j(9qpD(#o鹶KBsܦeE:S6={Ot6L0K&I=g~i cE^ .lblcz%+yPH1GlD{hm8Ѹ5հx)Z`icRS#up::˼lsW6vM1azGNOE`/,Bbw$Dod{aG YbonmҞTv@(p {{7 r/S2UK)Ey/)g(sH3y*)Dٛj(":~C\[vŽGx5k{qAD,j/}.`7dtR/10oc˘=p $C6N#;\&͗sTEʖQ+ ǯWEhW wm5<`m{h:.\ڱ (er\k"qnZh1){Lfr+%X?`K,$k[Fg/-fo|u^?T@W&ó,soG8Odʘ 4N3H*һW hFqV/2y.^ߎtƤ/f_? ,+7+}"' BDo#Q^BiDeٛ*N(AB"S7m3ʌ ( 3g4cP$\: npJ^2&ͩ"c"5`h#rƲ$Zu]5T(/nѕ]I5_Xet$eC,v@oH#1_Zhd حy 'Ze E^i맰jm!d~Kv j/n=ڌEk`,U[= g`eQ*ۅᵂdl #AHۍ=qA!#].ѼŽX=fR0 c0E;ڴ,uXc6[[ ?raBW,-P4)J\,шo֗iMPa>wZ53Os56[(Ն^͌qn0\ >r1>7hYnŤXD1kl> jH&9- ~~ik\0ke\IϜċu迕P&EGa}<F9#S)?\V>FUhX%E"=_uZ>ىGC9ϜFKTUh^LcRjfT" 9EHK1pMyoճ^ʽD|#n*ʜUds SӑC")FlƸJ ݶ$a<ײn==&gC>lkIW$&1z+{!@'xl|(ғ_3fNw%K\?O<jMFqD$Y* MtHOndڣjk2T}5 pSԩ< FrN@=OeٖIͅP,E$Z)Uȣ5 (@rʯuY'hkuqOqM ?l*"Lwo'E&\O(a)22Po8knYM"Y))kx[؊0ehdK#[JQZyN'8wt;䉗uaz6P 61v}8^괜`M2a%D&|S{6L=JbSgNVzR(_| G yT)Ӵeq=qGR7 l*dl*~2>"fKAeѿ[ҷT{u!#qUwDIa- #\)@Ͻ`?:^ZnSUsSwU;;"AC3NvRFC*h)/'̇ڄFvpw-42,mV9=l9a-CM)/\!sq֘'AaE~|_jޙ:~[1x"[5)nx?Hs$VFW#_x*{7%vOn9UΨf4/ʧYDIny,WBX) @aџ7}ì V?~`t;NCP?|?a -/)aT޿Oֿ᭿ø0 |buk9w"w ^Z\MOƠic=̮~bew?BfI KRLZ =l:xN${3ގibK֏DT6܊ODxD=s;DSV*2 ٺ z3NÆ툛a/sRRI4Y-0lÑvf(WIoB ]ڊy5+̨l+Dq Ԏ5CnhtN? ![, , sʜ&Y:D7ǩΎ$לaݻ8HC' \pBy]&];qN HX_]Nx90E.mb~7f v\VMn꡼-޺̜] ?-Mf.m%pg+ C FsGE< y3Yxos WrF[;k^2CHgM{~XB. W"xtjnl@Ȍ/bUf2RRs֬Q0&?$D}>A. w&Z?1;9?~q~,&gSDP sdӬ@o)@;O`!fpjN$x]"I֣ !t`2q٘ƤNH<527qوWT5B9A \A34obC"S>wq喺b"|nOfBQp ǐ\TsZ۲utE;Y ?1t[uCܗUq]< F{-XQ *$=!؟9(Tf8|ӄ8w1p0fXZ*up+5{ VQ|) =+W,YGsH(Af&^H1# mC !ȩ9iOZD <J3V;*{T(?iH]ѓ+uH;eTF v[Peݥ[X>O %C,\̥a`ɭZ90x,ϻEXr;O]B{BWdaE9f2CH.yS6!U; (4v {}1QuwT.p9¸5xFhSdGs"TeclKrABOKCmGzX&xv` ,/,Γ J.#`hNu hW&SU;Vb-7#U kMݓ{eEflZUZhw02Pz]1ϻ[:)o Jϐ] Xgm7 짴珅 |$n?GP9l0W0NQj;<\bɃl!%% Q할$y>&f.o9 JÒ ]5u{p@7h֢LP~JX^z?oѮ~rUB 0Em+.m+)5љAj_YN/& zbwr7#'DN|cz#CUDو }d_,tݙnˢqp|#FȋioݮHf-ո}O9@<9nd9΋IJRU\X/#08@SC+*F\wTv q†R^a#`_V7O79a01]"K;߅V.S D趘K~kkko'Rt{gQ-pGUaʄ贞%OhvJW;ӈ*^Ys^)DPCZQ_@/g_gvMNޭ OKia%<_i%eH~b @|nns>ңiLIQHT8 n?G=67̊ܟKDr̿ΰrna ^桌ӆ)-c)P*3; S1d;n6ᬇOc If̎ȣa/8K`U1w&|q9s}Q]+{*0R̂j3,/>Mtʼc~;AΤ\۾F'=rK>Vwpi?$ V ж*Y6"AC!G>eH]ۋ Έ3'C0?ЏxMU(!#mTМs<,u5 .+`'OvGgzu_f&*>w'(G`hsJ"BBT2ھ.fj+%%9')t'EP99X\.i~""-\)Of\c$w5CE9-ڸeT1n$,.N󎮤Z4ܱcy ;Y|l b23uj$%`?Yi.PZZI"ZS\}fʒӻX9U_! `\bQJ~9)eFwU䋮Pb6݂f!EYg)_ #7'= Z%lv4ʻq16|]9=CHDNA9` 9 py5"cπO,k0>NHBxpP̨"J{0~5GfF-uJx.v 07`gG)fg _bVٱyl}9η4O?.㡴,zkM6X 0OZEQ}D洓P(7BҘ<(T7/9W_JɴE<$M:0ύqơsCoZ/ίmo_ s"E{Zz6~*FGΚUfX(^-iN < GL?L)ѕ㧭&'Ni!Z)s +4I!Ms q( غ]e+bQ$NJ+`-3g(dIC:a1S m" sBQ06@IycmH}Q+y5@یEZe=zp8#H^;' #6gG+:2 F!JƐsJz&:9RdφΊN )3WNˈ7Nխ5I7h .$_Z>s& %~/웅'o}PСb=T ]lbcJYع]_Pp ^ocV^àtF9sTiپwݬ $+3 >JǺ)}[+UStv/{@3;˟3QkHчv8RGk|۲{ӼHsjxW;2f=qo|[z_֜eED㊧] dG¿Gat5\IzBYT:>->Yھ,Ov;*,3MܹgSˮ@ %v-+G{ۥb?|{qG8w~.Uf QAK׋Rh.G@gI{qm¿`]Q+NRO8}'L`0[d'5̒9'110^WxI[ Ei2oHNK^VqL-RAIʤ˳| 2|lr1a-z>_?ng8{t r*"$a:HW ҸB'qwb[V`ugf{ۤvzvNBQԙ@-1-ԓ K٠J H!]̳G.5_)A}==ڭv;k ?qܚJr Acr!˔5E'H5&P 䮂otǝذ3; | :Ț.L [!3Acѯ@NWi'+>q$}ER$ބj,CD%Nesr@sw)r,ga;Ƣ5\oDc.BV5 tE{2@E0jofoD7 o ]91}7">qgQOsd`U Q ?f΃ڼa P7X->|B!d$;v-h3 oE/wsp@r|^Qe B=CVtrTS܋&.s(3ziDBhؐ%h@_A[yNީl TKN[\Q*G`E5 tn@@'S(1G3p^"Y9Mp噚mzB=D3*5]VGD7pܿ$9I6XivzJt6WSl|GKYVe?6wRǖB$dB^ @EJ||T~Kh1%x=2mʠ22(wrj^tRDqLX> `~] ~GP| L1(x$~wEt֗ 9b]A*G'+L-IKoW֮!&&Ҙ/Le&:~Wmt`|S_et)W0Vbo:a5o" LShxk hv-nM˯?ʀIPH,NJ:׏r5 U̓o9'"hrlȰ3 ŵ3R $%Ur!4J`&͇P;Q= YUM!8VuΑΡ* [y.+5|A~]GwT4򕴇GSN#8V cQW#Kg1L"ЁE|?\: 2tL/+jD|Vp0#H"A1m@ BAU$}i$0X%#w$S #Hi':bsy"u0Y~ƤypfL+xO`$9?|BW_;l1pZ2ĢNp!~b`m\gK iu:J9`vz3aj`˲cF LUzO ˝eα[b?be .X(_-.Ffs388{ =QjR^PS&J\ K,\g ᪒[:I+휚 f fW7U+#8qϞ煄-C*jԛ#Ii !h(\)x(@,c@ҭ {BXLp.K?v#́} 2>b/NoXcH!{3#))EHGr(HplLlm5% ]ZcoØ*T)hq"PrXp&"Ziµ,i+:MkssBFin)n\}Z?c5OO5=X%&v賚j;ݭp>˶9ɥe?@fW|-+ UK6wWw,v({ZmP$KYBU&ͧw%C]\sY[km+UKzr`<5 SerT::<'='R>ָ[D$0@Q?Jjf\Q|A?'TM^ )?=p+6fB ~ŽOm V=Df0肁f 3|,dSaJ0 㥦=anW^ ܊-|r &6pv=HxZ"&&nɰ4z T=l%\M#7s7TJ_~w+"KEl]34"ȧ }EQ-!F;ŧsIcFE/<\ )zXr-Le3vEb^dV|yJa.`{'%drf?oЂKJ@yI$j}7 yq%a`͓|'s [AWD~8|hjfXx0NKB[uYRu,O֑omGlS.ՅhUM8#!\=̕V@}I ۦ, P.Xyd&<~bX}U=m2^kW[*Uש3ժJD6]վ'1ٳԨꀲWͽnu+޽ o*Qg"w_QKoYO9`*i)"28PX*0| Ӕj^03=ɛ t;雋*V̢$! =(gW{xb4¡u4,[, 0d y(2'UEY>?dKa.ⷦc4 RJQR??fEC &[j@]Rݼ]fVb.X- YH&w!C4_,tKW\F^:FjB3y4qByk,?lVl`~0`U%\z,Gӯj[4+ ,&wxs&='ĦjxFRX`w"Wڪ?1HT)"˩߬$|weE;5Ŗ/EC!3*v} I?+*ef`f-P1r_+]OtlH'ɉ0qHfev)~= J ?yX\Q?`|7:sс5؛f3V[c9##=x>biJG% # 1fb@KST[,>c-U;_!4h ɠ36)MQNZ撊oNe3NC*&g/=Lg_Ϥ6rOG<ԪvG=W:{d9EKnodÝ`+8s2$ z<"`ZbQ+Ѡ{_(viE78kD)}S|vB$/cn)TEEqDuanMXyרpoL Ɣ&_0E)6&.&쏹0Diz?$CrUvi.eRٷ>/p?c#! .6ǡ'y<j'r.d{ܺ2i 1.f1| 0|rƶ9Xb=qž4҅T8} ҽ"FYdB]K3XσO>.%-&NnRzʼ:p˄鼿KV:@Kmg.yC_9xD125f˳7a˶1j2K3L5H'T}D@ۊ]/jS sm-Yc8Ο,:,ŶOaM|L3*vcU'0UFtg/0,Ѽ$ l3SxE%7i,]_ѾExV,?7\CVg!Ux ~X z-jPDm"p!t/%y/STvOs3هģ2>BkτHxqwi7Ľ;;Ȏ,&TKs>aJXa &Pu%Z痌$>CٲiSp(m*YnMP7HeY|n4±0l4By߽m3k;j iC#)Ќ^HɍL*D㖐U_,a7WJ]FCKR^[zku?^M~FR B~'m~w$qzݱrIş.ФT!lsG FT= G #86 S?kC ]k%9s5@;֏Qn:!1jjHJy!~U]^WθH̒@dEyC>,͆ t}Y `Cr( js S,HzG{h'i A5NH*+RdAМ(}6Ai?Y^8kkTK53Y񋶩U$KZígi{' Ř` U_uM,s*{b5to3P%_hjukCj߮~&e^(%^:ʟmP\ѡA!#yR@6̀ATH^NJx`~f~y?jV]!ocؼOW]A{ H.Eù{s0cS8zw{bbbh@7oH4b^)B%J0 PlMJj0"O0(w!D2> w pByoVmB aRkbE S=+_\I U>REwn8A}} ~gs:_|_uWDYU6s!M]62n3HmISZ0y ;)v(Ρ>|XH[QsҎ23S% F~8 iyL!%EmU n/8GbTw.Nµw9^RJYXVԢPRb[<%UȄIa9N)Dլ)Z#6@y.7֮qGXV|ߖA~C.[E;|3 )iJ7OZw'i5Uౚk+ӻ1CkrA`Ѹ#\[éy9p-;,~P;eZѡrC7JQģ^s@_:nb_"ͅv#+Pu3L}&],-Q_RK|^W#t` r cP_pF-0H(U&}x.A-߆9-1I$lF,;kae35Q]?D~@,7- kEe{'}o=x+ s^LfēI|ũvMrJ.FUȕoTd5lN Dp UNJFQ\7XR.񥜌U" mA1@EgM^[DW-A}ۋv ;PN`he7qpZfb4N\{{o[DĠBHNaD7n1cW3?ag$xo 'Uy.`w"\lb[đ,Q[2VU~nMUqV4n^qeReRY)F 3 ~B2lfC@TN*:LLLY#}b,JݞIUpCL9|xXx؇Lj%rm_._ Lm5Qa ƺ7M!K+~_Z +v< O /W]NKH|֫*\k^ Ixr8JMөQ06Ky=w%_&k0g<&E: @g9!C|eձ&(bri گ+ױruyex--r9S%tKk^G?P9/(Mgz㗻5|X 3ϑ0,l@NeN[۟zc1Z5E8DǮߑ'!yl,ձhI)3,%놽mCLԣK~RZn1C[%nZJƲ1*͈r7.ɋYp+q H ^QE$k'tK&a|{%GHc+kRsTIYv!JH oV$ѿQCߛk+;䜼8Z Vw#妈yI \,HpX93UٍWRT6_ݼ|xٲ&hU3zNTeG1uQN嘫s rD< |=~#8ʻ Zlt֘l!/g$;pڽ dsCJ b=ʔ zlw2|+J[ V/*pD|H5\6HئID_g8rnMkL =GJ%$:j$Zt}C`%Jq lwW4,B 1'If åcO(3>X6=22 Ͳㄭ$."5Zxs[)&q۹@ T&!*:2Z7&tf~Νvѕa!(y1uE6p$-xݤMW(6"\V=L^G.տ36r+V0 8KMÛoށpSTBDPJӌߚh(zf1l֎)(jvd|!i? Wƞ;ƶDuFox5_bcc8I$_Dw-'>ME2rn~֖ͱ`?Tb6*MF]~|~l!EGV"dVDS[Elq3Wtc:.2h%?/M)j%6juPzÓv'8xp"2)Ux5}-d@Di;⑿dK!AY@b*NŔ,]Ѫ"Y@,Kb1-EٱtZX YHJ=/YC[qhGNoc qjJtw♲G0O^DPSʇ|a*8,Fzx9L`>('WL<dM:FT!%\юUYMzx,LZ!јZ3T2Lpa\Al-PrL Ur1F<5[|GuZkp=^B צ4N_o;~*2m0Ej^Z&zO)h %~l4%+ssʥzo sĎbv̛zM۳Cwjy!$@^ UiaB u,GGѢҗ^~ A~z{Dqh܃[R>H2.GȢzoXx؈fMuBSYxOg-;o:qߓB4 Sb/!^Fp9Q!KqtM}1M[)){A?=3=kbKjAD9$ħ=ZOX`KMxޛ|Ss8tk&18EMkY o\'^޴'0;0j\XOJV14l/җ@-Uي0 >0hMB8w䎬ZZ8r -GT&GN?dѓS7T|7f`}-\N*QlGva=c~5 G+c9g' 8)7ู_uh}+֏P1;턾hS}ll}F܊WWoR\ӫ0Ҁ#N86FxuE  cb}t^ ޘ"N1#%<`n͹HOu۵pG `!}} Aq9Ŧl2qRPEsqGV@P ) H8ܵqj.ygu;r6ǻ;o*D_U6=t4ZJe{e)M%sSgz/"O6lzE2&R.#F:^m̃[_R9DNv.Zf' [ač rݎYAa($eE<9#Q,+„KAk9/nQ$*n((*m>1D!4_'nCƱCZM C*ft몺Y5Uc} _A߫MCDc$0=${վ+\)'/w3זks0+]Pf94{HcH X*k<5qT8mFe'̞E, ^VBcDLuޖ_>ĀmnP+ghNE=8?NiԆ¿* ƍc]=~JtZ8ܹ KVYŎ8rWvX8me5AaXd$zpde>ҏiH_h>Dfh%o.vR7;EXCExh d7͑~:Ȑ hm;<$!rL !e+묀!E ʇ#[ٻMyG"g ^VD$KӼ(YxZY˸.GcJvѳH6Y/>BHӼ* ]>ie@g+AW,ǻLC{US cxbQR?݄GD"#~>x*&-{8%-.AdE5"LS\_}boSތXy3x?&"- -ʐε S aU%axbz&cӌъI  E`McINa6H5=| N&l^qsСMZ`kVظuh0Z2wٽ=tcb0vOl=O[-q'Yd;zIeҙ"aS93$%DPB|lzm%NC܁"fO0z$my.,+p\jkͺWA2V#^"a !d0:eVcvH`9a(/ ZmyқR^{` Wݦ Sae ;w~|e؇F3s|8<6tUK#c 6UvA"U)e[q gEduY7udjj3N`­B`xL@Mx3ѿ:Guc 5/=?'6CM߃k9X6Oy?c‰}Xo1#T=~)-MB/TQ˚p` ǎ+遡p+E,X9@Ku1N< =>E15*" mbvBlu ]Q/ Ƒq;c"f\]2~\8;Ǘ@j|7a,c;(k>&hdn h5LCmw(連 5q*ObT4o lXij71jˬ[oI+"4\l%>U|?Xekm O-i\$F1"W9 FÖewKU?my .PNIr)Eӳ)i$gMevo$~?$U <#e7)7 P= {n՘x;䠊 r}x>1D? )f}9Լ)ϙ3C.'zoOx>B[0Q0Ʉx<9蕗Ne?Ā1\>66ze̿Gu`8~djŮ*,,6U}S;~pg\58Pp2n aC@AW,֒2ʍ<̉Xq}TB@U&D+sS2s*TϠBhXZR:7c -Ԁk&S=!eo'܁wXҊMwU)#GD8ix  [#*xk1 $ƾ4Gۻ4 T7AS7^LLo_S@+١=)zX`epʃ04u|$q{y)t lTXQа6vUd) VS)@RR[{jwLV 8?prc'IENhjQ*;FEA SpU15SjGV šTqXi$f+2 أ.I+Χ뽪#2 `0&=%!`ޮ; t%A&F3s*93n{g`f]aNC$\x<8iGL,ҬR 2ǁ| P=9 _+18w5GQxŦS$و.l{MpOTQ~:1♒S~f~ jj ѵC]*ӑQ_H8RJFE{F[hsKLg2F)2;ܡ 9I Mh|KIS>+(sɻ.5wRKJ)}H.u ̓T&\d[|);,͠fuX * gJ| ڥi.ي|CJ/]r-( zlԞ(5uIL# ٱB ~/ۤt'H{SKj07iidg*5VQNڜV+kUC\? tU:3('KcRZu9z] RiS@iQaaL8y`MpADhDK_1;S;|'4y5bkQWa)hIcOΞ dYb\COX΍}2q8?a,Ur0;1t;TtÞt7gZ໊)xt qo_yA{[d7kXʨ%Bԍ @ꗑ`xr )G1i-ư3X.* lRGzʱF{}hċ*Xw(&KięVlMD!VP)˔,va@I%鬳?2X JS T&oOC.7YJn&_*~⸽>>pґO" R+*Y23d^%VvB48[FJ9lq38}gîP)8~?T[#b nccѫOF wF T ,2>,)]VWk҉5mNK߄;wg])&Mw+W~?ޗVOlȘ=q3IDY]t?N-4\R[:v%Xf,`]N}[#Oa0&uWwf= oUk9al2+QAKdq=I^O,3ώ9Ba9W^W(3y *jj$&"V|Qgvaqa>Wj-f \ٷ_9O(;q_nV??q&UUR<'$+p߆LV1`w ] MǀaNc5n|vaA2]  W\@XYy5i0V&_NV^enE+/NIAA"P,~c#xT65!I }n<׶!68c_fb!};fkޕ$/=vWr2YZP(&NVJOۇ)͡xCL>QS+sܠEwu4 ;ߜ]S@[cFbXwP{IW9!2"K@iqsa^yDT1^@FwI^{rE(:IʝzL%2's*Z=4vXap*pՁ㈑L E#ԫgDh)Cq#ňِ5)H?|-B][y#1G<&y;ΘݰPsj֏t% M9 ikWzkMꡁsBz+u8sJcw̍kӤ{@CIK7jЎ˦Fx>K|>}&6_V_V޻t8~J9(liH|oxé/Ἷf#qG%9oaqh|t}y}; mV֝Z!KP:)5?@氆fQv ώ# Ԩ6xK $C,8)W6D0B *jM!^'ТL)-u]ͼd{R]aL oԼzVa+d/Fa+ rH8.'6]96yrpb!s2ٽb5@SgO ٦"tL}W5Pte0/*% 4,c-j軗;?'{K C̢\=I{ʧl/P' bvkwbc' (`"8\W8L+?K*(ɲ 8A,۩w_GM6V/Wr5j S{ihDN7֭,HA,ʲI#~m3e(¨?-4k mfrbdG7$FH+1Y̎s/l+c_E[#P;Iab׾3a[̹ ZPxby& QNi P6V<&d#P22La1($)G6@F2V?}ʧs}Oβ l:>A4+|P={ Ȼy=ҵP:k)zMh$"yOu4 v\x/qL|c^6j,1#1!2 #d°zpP :B>"|ή1Wݖ]Z5O0%VPeBFOטf"e-/w?-}U*ذճ51ƻ'GO6. cz5 ҧ"Q=2Pzb ?SF%|Фwn*=i]+8koPbm~l?hEZD[WPQrNVId0ɬC K_B;yܛ"ŴݤXW>,?k,_}1 C,i|=bMjg9$+3_R/v197*% Z|ؐO ҲV7߾n7=}~.:D)tx$6؃'q9 Wr͍@Oyy&D#X1_ 6;rF=cPQŠoNϬu,·B]{5Sd@9TZفHe^sc;!Us<$K^kVF zڝGmKdC>MH0?OG;Co#cqDzrpqIV_&4\Nޯ$(h9MP\ 5Hc|PhL*(ͥ~9UBt^VZ4"G*=eϊG:QLJkO ZrH~A._wuXMm!S2RL v3rv"3XgtVKeF1:\`Hq[/ Pxl6r?|\K$C<jl<>;%^9Vmp#_̠DUW0klœԞsJnyAk8?`&KBwRz"7R'NxOϐ(ZSB*V)Ζ -hM.*J^1*pHO^l4/B!h׆Չ#g ] cXVwO(v 紉H{"ɲ5Ǽsf{SCqGM5lB儤ϵ[`l5B}vsM("VM{ ߼a#Fjdt& CK"3~1`vg0E}ORf}t!ԿI ]7cHPФg^!JQr6z$pa꒛[)Ez#1ZUBNR4.ab^dZ19͍M'trI~BO*O=`{(UiƛaCdZv= K&&K9Փ+މ§}^(F!L<}LY8a^j/BUe Z;/On٥j񧘅1k8P&{-2`MQץ5fI{|n z^l2E*+U"d/S:}0>/tKF~P|S^'PI ِ>I)D|*:z~&T9 ۭF6A6,C֍,͎^F7&*Р|IpOz>'9o:M2K R1>[Vc6CJYC%& ,Ҏ mogƜm(b4?tbQclȣb) ~}x3 beu:a`:nz-4.;=jMP)\3ShԬd,2زѾh~z'qza0Z(.ڀL)l4L {NH:|sҞ6e9 #%gD8T2[5vR'ęnqԝo#7i Hfy}ϗ(0E Q jbWspB:Yܩ8yRҹXѠ%)ZJhV}-᾽P >y\y*ԓ,%) `?ީF8n}Jpv/4\ђX /ePL@P̉M%D#)Y6E4 I"=첖عP p5]?_E1YEVE_65/"O*XU@ $Q: 5(dGA1* rg0 ?IIJ]ie<&J7@M4maRP9\B5meG0zɍ$_DSgZɖ!Y!7bMH$i0 -okHmQR˛d8F I@4@j722[e+cuR}5y|iE&>֡CpYɺ"h+QG\IO,A5_pc4=<ߟYi'b8 b0+X@H-CB~\]0|,glR>ty)2΋mA=jܗ_~"6Z~d,͕p9;x0 UXo^"K]p.*VpNL`%$vg #,N2ur-<DZȞȿSfFm&x`د;s\hpw(ůDfAҰ)M_o2C˳sC'Ft?Y almkOud> Un h˜w ڦ.FզQC]>ב(QQT+ n| @v-/|'6˞_OL˅gHj,t6~(zj {Cue#t,;?fò?)=@SK2䣁ъB+>JYH3(!$xJɆP"G ơ :C{i3:4WdxLazDAGPz@/Qi++Zd^ rWqɱ 7=pTa2VŎ'B?u/F%=fh+N{A^5E-d#${^~lVÏ2J<"\r[ b5h6'69iG矿$Gr]VVOSvh1Z0&&^"cF@ Yz^ 1&dꝛ~2~%hΛ)Ō+mbl>F괡5yqQXG[kOgg^{Mwy\$\(=bФ+oOF}f+crl&#G-PnRPLxqQ%g5icN$vv2,=x{vסM߅+iףT4 "A`nvvvnb6NP)3t pD%!T2YKVݬR:GOP>31UYr n*~X^0+j{Y&j5ȗKw r nl\}33(Y&Hi~Bs'J1A]~œy+ZHÒ0 {FVk㉅9qcOwy(8Q3*TቈMdzD1£$TuSP]ץظ' mZ,l`jz>{ 1qĖMˤq&ڎQ;)16W*H`WRҜFu`&@XK<WԗpHP#" pȫTYENe~{ię6uL:N8ڄ;i:.ITհ#RBj,>tqʇ_gU!y9 "b18$&:8E4ݬY%  ޠ .x`!M {k aT̂OIn?%_ol0ջƋ_?$9)b ٴGD_e`'_( wMaFҒeKNnu0])Ev#d$3&K{(e׹|*Mj'k]R/ .|ylnIasf aĽS_# DE͹m94اjKh6Vn$KnjlzZoO=tFk:g"WV%:C^)܃"PuRm!xc |E,^؏ vj+ˡxM B%s9%[lHa`=&%gZ&+P,Qp̆7eJ:_ T2#Հst ^,O[L8=E!f ,zL`I۠C? #UOosCݏhS@?0vJ\ډ 6/ F4jwL[1gڇ{pD_DŽ^V<\nM٪i ۵R,xul=%lo; gW0?yUL'6&pPũkppx4n}ՐO(5 $,F3xAv6R)8߯~okbCGcmgx {ހCc1Qe8<#h~=Tǯ"$a&FK@˵Az4nr0$,JSw}%AHetl宫712.>-tƇ01+s7Vn*OjJkY?M?@MرaLnW KvH,/Z•i*UmR/Oeњ~ ࡞4xMP0%P$/2EM_|t4[y9(:`ŗ5~bl;'T娱J#7Y A6[ɗxvMÖkS Z54b-EG\H"3P+&6|ƘCo jC|zq@辻39{BǑtB jώwL5uP օ-zƘB4}Kِ)X/w]̚qgs4i's3XF_`軭!B))ax 8 6ƛ/{FxL[Zb(:YِZС@%>.ψFBfW~qG)zdvRI"u#[ϣS# ~@@ӆdqp!"1 y}f87\O (}YO0ꪗ]TWWNr>J ?,rgL9&Ċ?]mJ2'd?Z7 BXTdc2:%[ݞj_*&UBҚZT@~prI;*2?;]wJmVLUI) t jh_kAo!KWJ[ FxT%+?-C}BIê.){5 J5v8AIc0^Sc"5`~S׈~~KK蟏`MOWR%,l!2wŁ|j7cG M$eq̠ 9@*PYV! o7'y1]^"y LR׶ZT[3!yzG Q ] Z1@?|`%2bm}L Oi u[@{$lٺ^k2%йs2(g!|9HJdnm1`]eҗ!!;qijC DB!S ٿmH~Aza~ʪD: /QE*;!hQ˺whPlMYy߷TEl>paS@2vl aRtʷc|rPM Aݝr6+T1?_$Vhg96d`Hbp.`Mkؚ2PI/TT@1EI|vsRgX<*C|L2b4 6"mtʹ+D 6=] `i֢x:(z PI5 ݯu9dGo!0}pҠˉdW I4j"_uI&d%[X|1?$uylCJ8..5!#7q`d/dLc}o"d{7qq^Jo@c к?WRqLAhfue`zh?z^5%NK]c˟ߟiYE)]Y@ %@~oN.6K6E?<5{]5}pOoÕ>8EăG'eK73 z5/.S #`Kʶ}8$¨ Ys\_Y&dG,"e%ab}-y_Ktx.Qe"$3㲷ucu:*4cs dK F3$({o'bPzAE0jڬ9b-Iq!+6 YRUA71 'ؒkI}E.?G!:'XQ3G)UTKK4>}&JV_V~a( ɢm&ɲor{xQLa|u!}};Ji7Ը/-d+oW~YΒ[N`* ~ObdJNeFΔ/v`ofމ-h`ۓ{<:WFOa3#=U6\1 B mV< V9Ԓ#܅A-fzV!VLGO 'hjGV[KFg˟x'!>Q-W퀇u%5;dxoIOѰ|k-pJ㱦Г9峍v5ۓzña.aهT F!Ja(BܺǩַJHzNbV"` V&JN@vCz OpW2.d|O6kB?|{K5^[gGh+Bnth v p,_+krDX$dx'tEH'n  - {x uh 6#eDQk+(PCk}:=#*;UT3%o]89=%q<,2T^ϊz~S `kC6q~$D۟հn r5FϨ}%hgrtWrn8 p" l"Fe8Z8eŠ_|+Oy+ͤG$a&#Emq #%v=DCE@Vy@3rUTO/Z85X@?< a0D҇+[h=Kf!d*v̹nTˌ(>k9G O &uXod,xH ӎd6l ZaXRMT/~ݺg`Hb`3U fz c^~y&(qS5쥆/؈μdbq}"iaM7q6*{26sj<[K]x-K6`v`W&& "IJVWm|At9[K&u_fkSk 60dO˿Et!`1޽SmsRƙ7uΊŽLL%_NrlVy&5><ɘke`Vf{E? PêR{̅O1fu)oi _Y@tDیLMOFF7>k2"gL_&>ZqBb'+9ԶHߡ:mF9 /܇ka0 ̒B}rgDH:'!r:TPȈZ c9R2f9˫oy~_HwqX-C[N7a\ Nqϛ`5syi, ޭ5M!tSƛ'|-᾽P ,zKwZ3J7 ܬrx&@ #/XI EƺORIJ^u@ߙ0,{Ϯ)9_XIKW8dՌۅ,wPL K2|A5=Dz65/"O*XU@*{κqBI"%D>d5 -#*JI+9մtތkltIͪWN dRTp%Dޛ'@ÐR- DY Y#dO_/jnkPJR,vPo /KWӘLb0ټJtMv\qhr^ۗ(&vSgu>۶ @k\PT{? ʱ$sXQ:)'w=x |~!i:Kixit5lq\%?obL^lwɶ"WLQ+9cdBdA{bir@ǩp #ɺ"h+QG\wPF7uU-mEFf9FhԘnfYU&"EUXy /pX+Dn8'I(jY;$ޞ\ _c;sJ L\N3ǧV"cBĉ[&Y5ko [rEE}XgЍ]piNEE/hHä8 gj~OaBk1b6t^_ s}vA "sB  E"P% pA*k{CqIޚ롬h}46G$<:19}WaՃߵw` IoIrJS`H˫QaK#B51]6t3˚ꇗy Eq "Z2h^0Ya(*&Y855-lD>(%qgW$Y ݧv1ߝ*U)\&۲Fr!sZ`f&'طC&uSCSc^#)0[DKǧ Zu5CWˠs7@c42Ulrr:C@M>v.<'?t< W`l1Ook;ʉu2al߆]Eg%4Z ԓI(ϝq mJrghY4vf'^x|W ѝ`i`sӥ Wc%ṫ2W΂ W(dF5L,43ElKz9Eބ\X~o0[ ";P m8Vh)-QQvw4+/nlh{ O{4q~A$fLIב +!)~SWly8$X#Q鬨a^dgҾa3aEMQeZ@/@FP(DZ0Dn&_[*CʳE] >])hj#y7lЪEAK푩'+fz`aF]p*˒"pB5@5< K~ј"Tu}1;"c wpX3L u n)ƫD a$ː2vX ż } =0-[U:W/'M=2B2MIAkMeN9ȵ":0f,vchwJU~:8hgk3k#c L,Of}yјO[`9Oư}D-x Sפ*'p3 񙯡{Q#L..,J'a_uآЍT`г&M$|e֪'LӅ95\Q:XܮMrS͂ZB` 6E%M߅XBGSn7Y$n2w#rI/mUh:IT" ]@PwuTQo,%^a@?N,k?ѝ]' _Yf܂Siy;&(^Zʡ' D`))Pa( EH(g_ݺ{`]_ozO?XNWmanAjW`g' q {IGnY|c0Y.PRiC{CyCw̿˗ h:g-#S]tY@!ds!|?Sމr=Jds wIx +,۫QjW= \YM(aM{؂srI$BU'YOA ,-ӫKJYǂ&Tc!tj*~Q`Ȁ6N2ELgk_X=6 :cImg1q#."Ro^ٲ ~#@,5Qܞ~|^6CDžK_$漬;]o|STbS,q@s7;FahLh4M(McY LktQҧTipǣ*,  SOJze P,!'/<u8SIv &l דZ S+3P\1d#o[|_S/Y4W?8il%<7t b@Dc$ xd$*V}`O{ "<ߪ14ZA#hkKL7l>~?JLG `)2b$AZDDa>Znw[T݊L%f D˴l˘h.hũ;̯v5rPx< Ra1>Ifnߪ/t H7g7j՘&+Chc=t5>bWbx\wa"eJ܈X1Ԛ/HDF}wiǧ#h́T 8 Ҭ8/o] 7pSa-xXl=4^rDzk#W>CeLSY%ϲp5s!gh5gGހx{F`bi#bh]Jf "be▫n%|>2oӂNY`C 4DdQK'>g?h؂.?HKѣ֞X&6}PX= .|Jl q6mqҿNVU;cD45 TU$1OTZ֡8eҟ1߀t@7Ӯ`Bݥ]ե3{DCRN/ ERB"HW`j`I%Jr?&-t ,I|dȑr|Y E(Q7+7LW[O9,; ħx?wMavA+>O|e4n=vm˂K1 ,r3.VA$|Q:(&q젰e%?ՉFמ w[KMnxž4v;)[EU!_کu E ʟ4&(|fsڼV2Aj`Ebߛe&N"fXz衋Qu$uآBL~Y3ndƐ$j!0R,f@hnH"A&Eo;" ؊p L+NBuyY%ɛR&$ZcYnb 7AnBM]{@태K >[ Ɲ2nm~.\ Ic]V)4HG)hdWD68"sU @2::oQ镔GL4U&fP"[<%n*o'Ϭʸ&@eae_l;Z)UY[@V+C&>SX# ^%Ws /1#-{_qwL[|D7@ƁOR98B`&EЁG_`C_J #dImcW˳ ;وZTb!O!RS*9M/ـU~1uΠ좐xP1k6d"!GY7!lp\'8.§%OY?[vBd<.0!!rmgw!(` h,GX[R2)WYbjOV,;p@Z[m󂀗3`WUT]$ײ~ Tatl(t:t0eH#bp[!=J7WJֻWęM-%{˺5FdPR=5NH:@o*wjx#V?h9zjt5I aJF0$O"SY.!K;8@όH@0=VEx6+ZY җO|%H i\u w,.jM-p7Hrt%I}ubre}ljt&m=Tc)C7|uK9r}y$V4ȭ Qa>}ricƥ;u2b;LO^H I2 ,OV >̳G("Yi"qx93wjYW s5 Xr+ N0uc5hULS&Ó~'jURr`yMZY9L1CpԻ_$+|]ة]()6]o!,v;}&OX (9|}'6^ nr/Tp>n@mGX"|dDofw+aZt< :oDMKH()C{k@H)JjjW ]}эowwCaޖf}O:0tg4ц%UW!A~)M5g]sSa>p&L98*EzfÄ%9VGVV]Hlbc:1N\\Ma xbЇWJKO6 jN^<Â99a(wI%Bpyd6Z%TYdǯ`դ_@A!L܉mn;sDs:o +UXcPC\u,9o*8'ֲdՂ5'>o,Z3+ =nRXyS37x:3cj1!lJRd]>#5`_,,+Ѻ .esG& .lav= }۩=_m3?}қԿitbp|=}na?N>q?^t/GO7S4}7}7}п߶/o8.hOۧdUگGBwgL~ #)fN%Q1ܻR4Gg'.w#.V2zS+,l(9PideEDEb_ ' Η%{q$ =[ZTA+ș LYj,ٚ^gm/O@!_R,/(6,H́bK]\=MeԌ{"nHji!LbP4pWoˢ`!-l^Q968t34!+ѮBkmAhAyVߔUɯ}-+|aG X=N>\=Q#S-e3hHץnM3fdjprt)jt% ~Iڒ;݉}UF)tT.k>;Tw/WŴY`Voa65}_ P8w0g.]*Ԅ`i?5hqQcڴݎ@۴&Sk1 ~yG2(?(Ԛ[067J U$͡%wf~ )ۃqltifw2$o;!ӎ~#c-ϕAzvx=]Q7:tꈇR\z HFBvj,ov(V^Yp덩W/|h/rb9laiw߽98cLד^HItm5őE蜠"P[1m4u_".2ɜ03مKrWr7_`B͔}NZdemnim?tB5ٴlb.{"VO# j:mVIVt|O>%-*i6DK^RmH%oUϨoGixĜy!,Qd1wo9RGa2L׆=Y [BxsA)mٌ*"ȗRO"p Z &6'Ӟ0 |%%>l/m8oLx_wKFĮ4|v.n,jKI%عv~I@qiz|| /kȑ0{6O'J4"9Nlexȝ/SpH$Zbdd0#s@Op2/[6H&ׅN2$v]>Tkgip:M M#("; 9$0^rK*jû!n>ԜVS$߀hd}aȾ6?eTNk;l8@'?W 땝$ :A0;096"Q٠ NhJaHՑŃ ᦽҩd/W_.3Q )z0]/%C9uԒ!̛RiB"XA*o몆x7!:Lj%?@m1J#)QFKRȁ> цCw@/*pj[jgR2X~Mxpt-cd‰r$HrmF^!NV$ɓt*޿d"@}VO`/krMa{0Xyf B}UPE;p+Zp:5U(~N/,S40y_܌~l+b4Jpv/%5_aSp{"P҂]XFU9n|CؑDk+{miGxt(*9{z1#N tAE]$>FߥO3ձ`DRd ,Y-)wGl a,C?mPmcai7VzGAQ]G] lОʩhz";K4=g hp]Iަ\7Ifh]Q nx9/,˂T*(Γ&JJ 4Y]ABf2*<27Le@tRRI)@ٖPO T}gHς}~g}X:h_gE|G3+k#[[JL$0sVʷ߿]n7a1B~p6ʥm1'ϔiyzijv4Bqp혙Zi@2w(1sC]||z>w+߿r*^2]2(1?ov3jDTM%UTˈDb($Kԡw1msfe^D([L]cYʀ G 'fFi\&kys>'Ve󶘺:A^Yqc6z G^V}VE_8 }ZMPȹЪZlk]Jq|藣LxdbXK=閿*'6yo'fVvB:j^FPd[y~l$F7 !KDn {63- k2>Җrv40} X61'i wj G|@4]˜WR>QKlKEC<*s}6;,5Uh 2=^,'2pM Oxn9_( Z߂l;$Bw5"ik~"" $&M!74S7 !pS"z:0s YP]xto/Э p 1$& CG .:y&4 mp~]sg_W+V͌U3>Zvz;6})j,":  ùn%4D9IIƑ`F4_ϑ@GU` xtKÊn3<QdY6^D a!_a+EP*crx aρҿm.g;.'Sp_#Zx>bYx;8Bf lj4n{OON^,ѸˌjifxB>ߎʥ(:!v`B̷&_BqׇxH'xjBmE_&[Ș֣ߖg}͚$|r= RwT:/ L'}8*$Q4;=H{hz_ $zbdwr"XyXdfB˔, ɡ.̋ZÌȕ hK޿t;{. AU{< J\ӿTr;2D2YVTldQ#s71޿j㕅N`pDiC$yESrxolW泺x86p9)s!ӿʄ1u8ھ!jP4=3kY3f :̃@zz?(7ܒ|XS Ȼ,|#8[m0ۆ6H=0ދMͼ4-5ܮ+ ǚ|"xOnz57hrcxWW5Ss@,~ةr:"lVa iixwZ~j~;m̘4]"β{~%> @ ~-O yoRQQuUבA`i Qx|Ʊ'P;uUlp_cD֟-B\yq{9J“(qfVH5`^‹}8}̫2Ж] FܝLC$ e2y +`3ݰ&|83#25̃Yé=`̶>컿ǁklE{ca[:CD[Bҩ~9_̳≮׎*8ta.xH>)\ 3,o|0n%%O;V?1ymoYNy.O%ӴP`Ymڥ ?hҿ~IS!m߲=oN/anQ,}'Τw.^T +`g[YEIϟ.`&֯ݣ_c(rЄ9ˢZh\~,kYGH Z+= }v S8X4d6Zɴ\cby7LPH[Vv;XhQNfjx5Ę禽EJ<\GX(Zk{c'J3Ͷ8/`ˬ p'EכLkjW-nsjꤺf˞Zoz ez>L$|`;P`գɖCt@ .DQ7܁'ˉ(|`Br%3{j&E[1 jW92V4[~ao7Q' l[g˜[Woگ!a ;ҚdUrGY%y{m"P74{m L) ݢ.og[3X?ӊ~Ee, XgJN BWѲ_^<xeɞʃAߏ)uLj<[ ԫEG2I7LdK~ y..?[4a1QSND@x|pMrJų 8rQzF ׶`xQ*J-b=Մn qpIVv4.̬B9Lxvqes#'Ty%/$qI1vV2r$%R^8DgoIgVƊ6RPoP~05ܑ1GA8.KSMDTEkM~ڣmfqJqMK,v;{WUr3 $dUbRl+ o٫<$U>'eG+Y!qVfAgL'8FH[%oӻ$p (t@:7Ym XY)B&P;z$cF֑F=ˆp_ S$RXrA*NU&e)zѦ O d|:j5tUAV,t=uKs' ㏥, \nbYw:`cᶲ顟sRHY tH4}pgfjmFM<]<X5ӛ)5X|YZ86oϴ{3K֨\2wJ;HL(RRo<(2e %_w(dkyاB4#?4~crcLD!#i(lE)dEuT?e×!,+e+XުDb^2$T8`^9g\6M m-6p,hJĈ/ٖ;P9.PC#rL쁹"8pO|Fcp=6-BRbˌ&XBv8rl{n|CH9DLifn"Y7 I(~w[`XPŪùԧt`񕌛q_v 1O%aIVE:/ĥ0O$Sn+n5cs;, ՟NzdzqgY ̎H_5WAEJVWz[$+FY+L<9  1| NP_!؍&Y-ݎX!3YT❱ h׏B6r~߫r:_I?Wj-8 HӝU ى7%9[ZZ)Ȅ%^3b9[vMݬʷ |0LRU(?)0 ՏyǗZ2 L&-:l3:HB6o6٦Nܙ U E/d{*l3s}Z%-Y4Uk{_gX优%sf h@/?zEA9(gx jA|! 1-F{*n̡.aQ\'8t/nZғŸj粦 8e|eojVDY{@A+ K0$ӛ9o{ ?Yynཀྵ s?Qu\"dǬsP%02GC~M*~YDtJW4N<&)ً?*Rky4FtaT)R.,@ϘJNfh=1Ǩ/} 6%Br F.+RGD#]z+@hǛ+@`Q|(97P_b]Onoak_jno(#^tUb$ա )9wrV)Z8YC0x.,4L E"YHU+!d)HPJC A[S3+twfJ1NiH4&:~5h'^: }f/%mp>ÿVOIzc-Rhj233 QLJ,>P0ZzkPbja~_#VOicnV Bffgpodder-3.5.2/tools/mac-osx/makefile0000644000175000017500000000343412220076757017000 0ustar thpthp00000000000000# # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # the installed path of the gpodder script GPODDERSCRIPT=/Users/elelay/misc/macports/svnlocal_dports/gnome/gpodder/gpodder/bin/gpodder # the /Applications directory APPLICATIONSDIR=/tmp/Applications APPDIR=$(APPLICATIONSDIR)/gPodder.app BINDIR=$(APPDIR)/Contents/MacOS RESOURCESDIR=$(APPDIR)/Contents/Resources # current version of gPodder VERSION=2.3 # set OSXVERSION to darwin8 to get the Mac OS X Tiger version of the plist. OSXVERSION=darwin8 ifeq ($(OSXVERSION),darwin8) PLIST=Info-10.4.plist else PLIST=Info.plist endif all:$(BINDIR)/gpodder\ $(RESOURCESDIR)/icon.icns\ $(APPDIR)/Contents/PkgInfo\ $(APPDIR)/Contents/Info.plist $(BINDIR): mkdir -p $(BINDIR) $(RESOURCESDIR): mkdir -p $(RESOURCESDIR) $(BINDIR)/gpodder: ../../bin/gpodder $(BINDIR) ln -s $(GPODDERSCRIPT) $@ $(RESOURCESDIR)/icon.icns: icon.icns $(RESOURCESDIR) install $< $@ $(APPDIR)/Contents/PkgInfo: PkgInfo $(RESOURCESDIR) install $< $@ $(APPDIR)/Contents/Info.plist: $(PLIST) $(APPDIR)/Contents sed "s|__VERSION__|$(VERSION)|g" $< > $@ clean: rm -rf $(APPDIR) .PHONY: all clean dirs gpodder-3.5.2/tools/svg-source/0000755000175000017500000000000012220346122016004 5ustar thpthp00000000000000gpodder-3.5.2/tools/svg-source/gpodder16.svg0000644000175000017500000016030712220076757020345 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder22.svg0000644000175000017500000017145212220076757020345 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder24.svg0000644000175000017500000017142612220076757020350 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder26.svg0000644000175000017500000017310512220076757020346 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder32.svg0000644000175000017500000016602412220076757020345 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder40.svg0000644000175000017500000022532112220076757020340 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/gpodder64.svg0000644000175000017500000016756512220076757020365 0ustar thpthp00000000000000 image/svg+xml gpodder-3.5.2/tools/svg-source/podcast-source.svg0000644000175000017500000044623112220076757021510 0ustar thpthp00000000000000 gPodder podcast cover art image/svg+xml Thomas Perl <thp@gpodder.org> gPodder podcast cover art 2010-02-24 gpodder-3.5.2/tools/win32-launcher/0000755000175000017500000000000012220346122016450 5ustar thpthp00000000000000gpodder-3.5.2/tools/win32-launcher/downloader.c0000644000175000017500000000521312220076757020771 0ustar thpthp00000000000000 #include #include #include unsigned long DownloadFile(const char *filename, const char *url, unsigned long size) { HINTERNET inet; HINTERNET connection; FILE *out; char buf[1024*10]; char line[1024]; long readBytes; unsigned long totalBytes = 0; int error = 0; HWND dlg; HWND progress; HWND label; MSG msg; /** * TODO: Check if filename exists and is size bytes long - if so, * return size immediately without downloading the file again. **/ #if defined(GPODDER_GUI) dlg = CreateDialog(NULL, "PROGRESS", NULL, NULL); progress = GetDlgItem(dlg, 1); SendMessage(progress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); label = GetDlgItem(dlg, 3); SendMessage(label, WM_SETTEXT, 0, (LPARAM)filename); label = GetDlgItem(dlg, 4); #endif inet = InternetOpen("gpodder-dependency-downloader", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); connection = InternetOpenUrl(inet, url, NULL, 0, INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI, 0); out = fopen(filename, "wb"); if (out == NULL) { error = 1; } while (out != NULL) { if (!InternetReadFile(connection, buf, sizeof(buf), &readBytes)) { error = 1; break; } if (readBytes == 0) { break; } fwrite(buf, readBytes, 1, out); totalBytes += readBytes; snprintf(line, sizeof(line), "%.2f / %.2f MB", (float)totalBytes / (float)(1024*1024), (float)size / (float)(1024*1024)); #if defined(GPODDER_CLI) fprintf(stderr, "Downloading: %s\r", line); #endif #if defined(GPODDER_GUI) SendMessage(label, WM_SETTEXT, 0, (LPARAM)TEXT(line)); SendMessage(progress, PBM_SETPOS, (int)(100*(float)totalBytes/(float)size), 0); while (PeekMessage(&msg, dlg, 0, 0, PM_NOREMOVE)) { if (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } } #endif } #if defined(GPODDER_GUI) DestroyWindow(dlg); #endif fclose(out); InternetCloseHandle(connection); InternetCloseHandle(inet); if (error) { return 0; } else { return totalBytes; } } gpodder-3.5.2/tools/win32-launcher/downloader.h0000644000175000017500000000022312220076757020772 0ustar thpthp00000000000000#ifndef _DOWNLOADER_H #define _DOWNLOADER_H unsigned long DownloadFile(const char *filename, const char *url, unsigned long size); #endif gpodder-3.5.2/tools/win32-launcher/folderselector.c0000644000175000017500000001151612220076757021652 0ustar thpthp00000000000000 #include "gpodder.h" #include "folderselector.h" #include #include #include /* Private function declarations */ void UseFolderSelector(); int FolderExists(const char *folder); void UseFolder(const char *folder); void SaveFolder(const char *folder); const char * RegistryFolder(); const char * DefaultFolder(); int AskUserFolder(const char *folder); void DetermineHomeFolder(int force_select) { if (force_select) { /* Forced selection of (new) download folder */ UseFolderSelector(); return; } if (getenv("GPODDER_HOME") != NULL) { /* GPODDER_HOME already set - don't modify */ return; } if (FolderExists(RegistryFolder())) { /* Use folder in registry */ UseFolder(RegistryFolder()); return; } if (FolderExists(DefaultFolder())) { /* Save default in registry and use it */ SaveFolder(DefaultFolder()); UseFolder(DefaultFolder()); return; } if (AskUserFolder(DefaultFolder())) { /* User wants to use the default folder */ SaveFolder(DefaultFolder()); UseFolder(DefaultFolder()); return; } /* If everything else fails, use folder selector */ UseFolderSelector(); } void UseFolderSelector() { BROWSEINFO browseInfo = { 0, /* hwndOwner */ NULL, /* pidlRoot */ NULL, /* pszDisplayName */ "Select the data folder where gPodder will " "store the database and downloaded episodes:", /* lpszTitle */ BIF_USENEWUI | BIF_RETURNONLYFSDIRS, /* ulFlags */ NULL, /* lpfn */ 0, /* lParam */ 0, /* iImage */ }; LPITEMIDLIST pidList; static char path[MAX_PATH]; pidList = SHBrowseForFolder(&browseInfo); if (pidList == NULL) { /* User clicked on "Cancel" */ exit(2); } memset(path, 0, sizeof(path)); if (!SHGetPathFromIDList(pidList, path)) { BAILOUT("Could not determine filesystem path from selection."); } CoTaskMemFree(pidList); SaveFolder(path); UseFolder(path); } int FolderExists(const char *folder) { DWORD attrs; if (folder == NULL) { return 0; } attrs = GetFileAttributes(folder); return ((attrs != INVALID_FILE_ATTRIBUTES) && (attrs & FILE_ATTRIBUTE_DIRECTORY)); } void UseFolder(const char *folder) { if (folder == NULL) { BAILOUT("Folder is NULL in UseFolder(). Exiting."); } if (SetEnvironmentVariable("GPODDER_HOME", folder) == 0) { BAILOUT("SetEnvironmentVariable for GPODDER_HOME failed."); } } void SaveFolder(const char *folder) { HKEY regKey; if (folder == NULL) { BAILOUT("Folder is NULL in SaveFolder(). Exiting."); } if (RegCreateKey(HKEY_CURRENT_USER, GPODDER_REGISTRY_KEY, ®Key) != ERROR_SUCCESS) { BAILOUT("Cannot create registry key:\n\n" "HKEY_CURRENT_USER\\" GPODDER_REGISTRY_KEY); } if (RegSetValueEx(regKey, "GPODDER_HOME", 0, REG_SZ, folder, strlen(folder)+1) != ERROR_SUCCESS) { BAILOUT("Cannot set value in registry:\n\n" "HKEY_CURRENT_USER\\" GPODDER_REGISTRY_KEY); } RegCloseKey(regKey); } const char * RegistryFolder() { static char folder[MAX_PATH] = {0}; DWORD folderSize = MAX_PATH; HKEY regKey; char *result = NULL; if (strlen(folder)) { return folder; } if (RegOpenKeyEx(HKEY_CURRENT_USER, GPODDER_REGISTRY_KEY, 0, KEY_READ, ®Key) != ERROR_SUCCESS) { return NULL; } if (RegQueryValueEx(regKey, "GPODDER_HOME", NULL, NULL, folder, &folderSize) == ERROR_SUCCESS) { result = folder; } RegCloseKey(regKey); return result; } const char * DefaultFolder() { static char defaultFolder[MAX_PATH] = {0}; if (!strlen(defaultFolder)) { if (SHGetFolderPath(NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, 0, defaultFolder) != S_OK) { BAILOUT("Cannot determine your home directory (SHGetFolderPath)."); } strncat(defaultFolder, "\\gPodder\\", MAX_PATH); } return defaultFolder; } int AskUserFolder(const char *folder) { char tmp[MAX_PATH+100]; if (folder == NULL) return 0; strcpy(tmp, PROGNAME " requires a download folder.\n" "Use the default download folder?\n\n"); strcat(tmp, folder); return (MessageBox(NULL, tmp, "No download folder selected", MB_YESNO | MB_ICONQUESTION) == IDYES); } gpodder-3.5.2/tools/win32-launcher/folderselector.h0000644000175000017500000000016012220076757021650 0ustar thpthp00000000000000#ifndef _FOLDERSELECTOR_H #define _FOLDERSELECTOR_H void DetermineHomeFolder(int force_select); #endif gpodder-3.5.2/tools/win32-launcher/gpo.exe0000644000175000017500000041101612220076757017761 0ustar thpthp00000000000000MZ@ !L!This program cannot be run in DOS mode. $PEL 9$SO fl@ 8.text\df`0`.dataHj@`.rdata l@`@/4x@0@.bss`.idata |@0.CRT@0.tls @0.rsrc@0US4@tD$D$$Ѓ $@PF!EED$ @D$ ED$D$@$@_@uJ_$@ L_D$@D$@$_$h$@D$p@C$_@D$C0$v_@D$CP$b_oUSE=w;=rLD$$/_1[=tM=t=u뵐=t==uD$$^tdt$и륐1vD$$ ^tJy$ иh$иUD$$]^9D$$ A^D$$%^u fU$d@|U$d@dU@fUt@U$@jRteD$@$]tD$@$@Ћ D@t1$)@'Rt*D$7@$t $D@ø말U$@Qt%D$K@$t $@ÍvUWVSLEEE܉D$D$ D$D$d@E$[]t E܍UT$D$ @D$ D$D$$ ]u< @E°MԉH @»@׉މE @E܉$\Ee[^_]ÍL$qUWVSQZEEEEEDž@$@ E:EC¸@։(uEE؋E;|E܉$D$D$$@ u3D$ D$ʐ@D$@$[$ [D$$ CD$D$$ZD$\$ZE}uD$/$ZE}tNE$c u3D$ D$ʐ@D$@$([$EZ$<@% Eԃ}u;$1E}u$E}tE$ Eԃ}D$ $D$L@D$p@$ZD$D$$YDž°ЍPЉ»@׉މD$D$@$u=u9D$D$D$ D$D$@$ D$@Eԉ$ Eȃ}u3D$ D$ʐ@D$@$Y$XD$,@Eԉ$N Eă}u3D$ D$ʐ@D$<@$.Y$KXD$b@Eԉ$ E}u3D$ D$ʐ@D$x@$X$WD$@Eԉ$ E}u3D$ D$ʐ@D$@$X$WD$@Eԉ$X E}u3D$ D$ʐ@D$@$8X$UWD$@Eԉ$ E}u3D$ D$ʐ@D$(@$W$WD$O@Eԉ$E}u3D$ D$ʐ@D$\@$W$VEЋC@D$CD$$EЃ D$~@$@EЃE}u3D$ D$ʐ@D$@$W$4VE$EЃD$@$EЃt3D$ D$ʐ@D$@$V$UEиeY[^_]aÐUx,')EED$D$ D$D$$ȓ@ED$D$ D$ D$E D$E$oED$@E$BUE}ED$ D$(D$E$u EUT$ D$D$$TEE߭ @E߭ @\$\$ D$@D$$ D$D$@p@@$3T}E$#TE$$E$}tEÐU}t $@SJ$Et9$vb$%t$$I5$jt$$UWVSLUĻ@׉މEĉ$E}u $R@߉D$@E$u3D$ D$@D$8@$YS$vRE$$@$@Je[^_]U(}u-E$E}tEtU}u3D$ D$@D$Ĕ@$R$QED$$@u3D$ D$@D$@$]R$zQUWD}u3D$ D$@D$@$R$8QED$D$E@$Q t3D$ D$@D$d@$Q$PEE°MHPET$UT$D$ D$D$@$dQt3D$ D$@D$@$AQ$^PE$Q}U8EE`@t `@ED$D$ D$D$E@$PtQEUT$D$`@D$ D$D$@$kPuE`@E$ZPEUWVS<@@D$@@D$ D$D$$nt3D$ D$@D$@$O$O@@E°MH@@»8@ ׉މ@@e[^_]UWVS}ua»D@G׉މED$$ND$ $D$@D$$ruzÍvkĴ@HuĴ@$ȴ@GPfĴ@tĴ@f$ȴ@GRސQP=L$ r -=w) XYÐD$,D$ D$(D$D$$D$D$ $ÐVS$\$0t$4D$8T$@hS(J uZ9Z~uJ ZCZ([Ív L$$T$DT$ZCZ([fUWVSLD$։ˍD$|$$l$l$,D$ D$(fD$\$Fvl$} ~Ol$} |$|$ tz 7 \$(F Ӄ1͉1 u;t$$w|$,u |$o ~ .Fl$l$ ׃ tvH׃ u11Ʌu;t$$w l$} x0fKT$PL$T ɉNyfD$vfD$\$;t$$kl$(+T$$L$L$C ~‹D$%lgfffD$D$)*EGgfff)ʉu;l$(D$()CD$2D$ D$ ND$ @Tڸ0C XoC~%CtHCfڸ0PCPS;t$$v5l$$v-9v!N.uvڸ0C PS C P{Kt$]l[^_]ÐCڸ-D$D$ T$T$fD$?PSfڸ dCPSST$ ڸ+<ڸ +fD$Z؉ٺX@f19ٺ\@&CD$T$>T$$~8D$>.t$@T$?0|$|$ ~k fD$gD$ut$?T$$UWVS|$$$0$u@t1t01؃$T$<$T$@D$DD$HD$LfD$PD$T$T$XD$\$L$,F%$D$@D$HD$DL$DL$(11ɄtpC Z9/5T$(t#T$(T$T$DPЋT$(uv1HD$T|[^_]ÍT$< $@fCv;lL$@!zfu$9D$@uU1ɉT$`L$dl$<,$xvt  ET$T[vvhjfD$@ D$@u EUM$T$L$D$<fD$@ D$@u EUM$T$L$D$<fD$@ D$@u EUM$T$L$D$<jfL$@UED$`l$dՍL$1vƀ~tB9|$Xv),$L$xؿ<[^_]1vD$T<[^_]ËD$TO<[^_]ÍvD$cvt$Xt41t$.ǀ|-t/9|$Xv,$L$x1<[^_]OkWVS@Ët$P|$Tu 1@[^_ÍvtlD$<|$X|$<tPD$=D$\$D$ D$192u9r[^_[^_ÍvUWVSLt$`\$d\$4$F1F$D$4x FD$8ntt$2\$8 5)ыl$Rdx 8Nbz ,<Rbr $,6@NXdnx2BV.>Rdx 8Nbz ,<Rbr $,6@NXdnx2BVRegCloseKeyRegCreateKeyARegOpenKeyExARegQueryValueExARegSetValueExA{CreateDirectoryADeleteCriticalSectionEnterCriticalSectionExitProcessGetEnvironmentVariableAGetFileAttributesAGetLastErrorGetModuleHandleAAGetProcAddressInitializeCriticalSectionInterlockedExchangeIsDBCSLeadByteEx.LeaveCriticalSection1LoadLibraryA\MultiByteToWideCharSetConsoleTitleASetCurrentDirectoryA&SetEnvironmentVariableAtSetUnhandledExceptionFilterSleepTlsGetValueVirtualProtectVirtualQueryWideCharToMultiByte7__getmainargsA__mb_cur_maxM__p__environO__p__fmodec__set_app_type_cexit_errno _iob_onexit_setmodeGabortNatexitPatoiScalloc\exit_fclosejfopenkfprintflfputcqfreeyfwrite}getenvlocaleconvmallocsetlocalesignalstrcatstrchrstrncpystrrchrvfprintfwcslenECoTaskMemFree<SHBrowseForFolderAXSHGetFolderPathAeSHGetPathFromIDListAShellExecuteAMessageBoxAtInternetCloseHandleInternetOpenAInternetOpenUrlAInternetReadFileADVAPI32.DLLKERNEL32.dll((((((((((((((((((((((((((((((((msvcrt.dll<OLE32.dllPPPPSHELL32.DLLdUSER32.dllxxxxWININET.DLL"@"@@@@@j SO j SOXpj SOj SOj SO j SO0j SO@j SOj SOP`hp%,(B@n(hvL(  -+% 3.+9,5;;+8U<+9c7,5U=RqPm~Xy]`uSq  ?*<tPoWZ\[wSs`C]nNjgHc`C]cF_[BX ""?)<C:08111111$%%!""000%%%+++555K CSSSu4$22!/TTTjjjVUU111DDDg;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW( @ ##")'%,)! ,*& /+$ 1.'/.(.,*i)(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:C8@9::-./2-*!;,7E0B[?XlLhyVu]}adfgV>S C-AtRpgd`][[\\\eJa!""888''&*)) ...221 !"*+*79;?*< Z>VcWXYYZZZ[[pVm+*)$$$,,+(''!! 00.%%$///$$%$#"?)<V;ScWWY\]^]ZW`E]  $#H0Fŏge^wUslMieGbaD^cF`lNi^}W>T?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=G8E$$#543...777 &%%CB@@?>100+,,322 :;;;<=4,2>)=H=F@?>?BB;;;./0##$:::999>??565(('@*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;(0` *%$$$2).-"/-) **% ''' )%% [!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,9PNMBCE***EEEg )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<8/5-./&&& )))k /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^7%5 m >)g[WWWWWWWWWWXXXXweuLMNDDDMLJ./.***DEFPLI***EGHEEDNNL..-SRQ(&&EEE52/DFE"##)('KLMRRP9:: ?(??)=߉c]V~V~WY\_abba^ZWV~9&6  @);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckc6$4#"?)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=1(0/0/*+,*))...0/.CCC*** 210244++*-./234***+-.>>?345#">)=>*=5A8?///333899:==567788***((($$%665:<=GFDFFE"#$553567 10.:08?*<7KBJ++)'((-02 )*)/// !!!))* qrsm$"^SYIHGRTT]ZXXURTSQ121>>>MPQFIJ.-,LMN244555---)('@CC676))'EGH,,,111   [[[;*(*(*(*(!DDDKKKKKKKKK444(((QQQQQQPPPDDDZZZSA ͏*(V~WWV~0.kkk!!!;abbb...---U]]]{{{sKnWWkFf9OOO0003vvvIIIppp}}}aaaI0FWW5"2 (((NNNk7ZZZ|||'%WT{ ---///;===U|iEe+++ 333***aaa"""SyO3Kaaa>>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<>>3,%# ,*#.-(1-'0.(2/)#2/*'20++20*/20*320+531,96//G7.2U8-3_:,5k:,6q:,6u:-6}:-6}:,6kfeffiTVVGJKKJI//////5)' .-%//)%10*/20+931+?31,E8.2c;,6<+9=*:>*;>*<>*<>*<>*<>*<>*<>*****==898%%%'''367430 >@A===(%#&)++,,*+,$"!"""<<<)))+)&875HHH*+)%(*:::'&?*=fGbnXWWWWZ]`bdefedc_[WWW/-@);?)=X)=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~m&% 1 /?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`VNU:::643.-,vtp889RQONPQdca&&&""!=>?VTQWUR(+,ABCutp<<=ZYVLLL222WVS987##"QPP?ABhhk58:9871 />)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=##  '''010--- .-,)*+AA@9::4440 .?)=>*=;58 9;?<96.//.00(+, @AC0//%'(111888 '''::9556974???BDE###;:9TRP,+?**Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( iG<872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! g ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)  g  7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+QTU $&ABBUUUdddMMMg)&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+Coj`IIHZcj@;4ijj/7;59=AAA___g "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:upvH@fn}hjjPPP<<BBB```i%(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****;>*<>***;>*<>**;>**=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\6$4 k"" $>*;>*>>%%%mjf()(0 q}&,1uuy_dhgA+<?*;6OPN279stoB=:886TTQ)%"%%#>?@+*)xxxVZb753___wwwAAA&$"MRR _``___FFEEDC5/+___:::BBAhe`_eg00/DJT'$||| WVR<<;468hltSY\g?*<?*>>`ab"(.eb]fff```;:8UPKADG[`d```9::AEF [[[   *($ g?*='>*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\6$46:= 888  g>)<%?*```jjhQGB0*'^^^_`c```behrlf655000ZYVEBAJII behAAA<, cmi!.slfUWXkpp456567```~yea\QTT  y@*<?);?))<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?V~q}RRR###HFE877<)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>lck===<;:50*28="""CDC#(+63/<<<:73 &*===B;5]]^656RRR%"b`^KJJ72,49=IIH,25% 69<<==:;:579000000gea=KS)))vxx59< NNN%$?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*< aaa FFFeee %$>)<=%=='=>*=o>*=&$?)<>+>1>*=K@E}&/6IIIEKSvogpkiGNRkgeWZZX[\ca_7CK322hhhDFKtnifdd)16!!!bbbrrr%%%???221888^^^oiapv{367345IHG~yu)-1C>8NNNdddojb==>%$?*<9?+<%?* >*<7?*@BhmpKKK 444HDB*>>*=?*=8+.,38 >>> &"9AF??>#:?C  QQQLLL888A;5%-ABC 3' ??@SRQ**,40-&-SSS:::JJJ"2:@;73&!!!TTT./0 e ] [=);?*=memQIDJB>qqq,,+MOPABAEGGihezr997EC@ug`uqjSMG0/.::: ]YS:>@HHHBGJobV2DRGEC[^_ cc`D:0RY]..-TTOQF=$,bbbCCC%%% omhI7'Sgtutsuuu-+*IJESKE(/WWWRSRW %#=);l^_KJI|||DDCwxvqqr:@E|um73.wtqtrp}s689vxxNOMABC),rpn799wGFFTbd __`+&#P_dHLK1*+)46^^^AAA)))dhh \nocjjGFD)*+?CA946,46RRRNMM'''VVV  ___EEE"!eeb ``` TTT ghhWVV e_Uba`.))ca_55<b\R RSRfdc%-1\VPRVW ccc]]]WMDinm1%TUU]XUKOO)),VVVRTTooo"""  } }}}   dddk[QQQ \\\'jjjlll  D,AE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-B$"ooozzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvvv{{{{{{{{ TTTaaa/// kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-    h  00 %@@ (B (.eh_framegpodder-3.5.2/tools/win32-launcher/gpo.ico0000644000175000017500000030253612220076757017760 0ustar thpthp00000000000000 hV 00 %f@@ (B; (6}(  @-+% 3.+9,5;;+8U<+9c7,5U=RqPm~Xy]`uSq  ?*<tPoWZ\[wSs`C]nNjgHc`C]cF_[BX ""?)<C:08111111$%%!""000%%%+++555K CSSSu4$22!/TTTjjjVUU111DDDg;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW( @ ##")'%,)! ,*& /+$ 1.'/.(.,*i)(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:C8@9::-./2-*!;,7E0B[?XlLhyVu]}adfgV>S C-AtRpgd`][[\\\eJa!""888''&*)) ...221 !"*+*79;?*< Z>VcWXYYZZZ[[pVm+*)$$$,,+(''!! 00.%%$///$$%$#"?)<V;ScWWY\]^]ZW`E]  $#H0Fŏge^wUslMieGbaD^cF`lNi^}W>T?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=G8E$$#543...777 &%%CB@@?>100+,,322 :;;;<=4,2>)=H=F@?>?BB;;;./0##$:::999>??565(('@*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;(0` %*%$$$2).-"/-) **% ''' )%% [!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,9PNMBCE***EEEg )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<8/5-./&&& )))k /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^7%5 m >)g[WWWWWWWWWWXXXXweuLMNDDDMLJ./.***DEFPLI***EGHEEDNNL..-SRQ(&&EEE52/DFE"##)('KLMRRP9:: ?(??)=߉c]V~V~WY\_abba^ZWV~9&6  @);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckc6$4#"?)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=1(0/0/*+,*))...0/.CCC*** 210244++*-./234***+-.>>?345#">)=>*=5A8?///333899:==567788***((($$%665:<=GFDFFE"#$553567 10.:08?*<7KBJ++)'((-02 )*)/// !!!))* qrsm$"^SYIHGRTT]ZXXURTSQ121>>>MPQFIJ.-,LMN244555---)('@CC676))'EGH,,,111   [[[;*(*(*(*(!DDDKKKKKKKKK444(((QQQQQQPPPDDDZZZSA ͏*(V~WWV~0.kkk!!!;abbb...---U]]]{{{sKnWWkFf9OOO0003vvvIIIppp}}}aaaI0FWW5"2 (((NNNk7ZZZ|||'%WT{ ---///;===U|iEe+++ 333***aaa"""SyO3Kaaa>>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<>>3,%# ,*#.-(1-'0.(2/)#2/*'20++20*/20*320+531,96//G7.2U8-3_:,5k:,6q:,6u:-6}:-6}:,6kfeffiTVVGJKKJI//////5)' .-%//)%10*/20+931+?31,E8.2c;,6<+9=*:>*;>*<>*<>*<>*<>*<>*<>*****==898%%%'''367430 >@A===(%#&)++,,*+,$"!"""<<<)))+)&875HHH*+)%(*:::'&?*=fGbnXWWWWZ]`bdefedc_[WWW/-@);?)=X)=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~m&% 1 /?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`VNU:::643.-,vtp889RQONPQdca&&&""!=>?VTQWUR(+,ABCutp<<=ZYVLLL222WVS987##"QPP?ABhhk58:9871 />)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=##  '''010--- .-,)*+AA@9::4440 .?)=>*=;58 9;?<96.//.00(+, @AC0//%'(111888 '''::9556974???BDE###;:9TRP,+?**Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( iG<872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! g ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)  g  7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+QTU $&ABBUUUdddMMMg)&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+Coj`IIHZcj@;4ijj/7;59=AAA___g "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:upvH@fn}hjjPPP<<BBB```i%(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****;>*<>***;>*<>**;>**=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\6$4 k"" $>*;>*>>%%%mjf()(0 q}&,1uuy_dhgA+<?*;6OPN279stoB=:886TTQ)%"%%#>?@+*)xxxVZb753___wwwAAA&$"MRR _``___FFEEDC5/+___:::BBAhe`_eg00/DJT'$||| WVR<<;468hltSY\g?*<?*>>`ab"(.eb]fff```;:8UPKADG[`d```9::AEF [[[   *($ g?*='>*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\6$46:= 888  g>)<%?*```jjhQGB0*'^^^_`c```behrlf655000ZYVEBAJII behAAA<, cmi!.slfUWXkpp456567```~yea\QTT  y@*<?);?))<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?V~q}RRR###HFE877<)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>lck===<;:50*28="""CDC#(+63/<<<:73 &*===B;5]]^656RRR%"b`^KJJ72,49=IIH,25% 69<<==:;:579000000gea=KS)))vxx59< NNN%$?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*< aaa FFFeee %$>)<=%=='=>*=o>*=&$?)<>+>1>*=K@E}&/6IIIEKSvogpkiGNRkgeWZZX[\ca_7CK322hhhDFKtnifdd)16!!!bbbrrr%%%???221888^^^oiapv{367345IHG~yu)-1C>8NNNdddojb==>%$?*<9?+<%?* >*<7?*@BhmpKKK 444HDB*>>*=?*=8+.,38 >>> &"9AF??>#:?C  QQQLLL888A;5%-ABC 3' ??@SRQ**,40-&-SSS:::JJJ"2:@;73&!!!TTT./0 e ] [=);?*=memQIDJB>qqq,,+MOPABAEGGihezr997EC@ug`uqjSMG0/.::: ]YS:>@HHHBGJobV2DRGEC[^_ cc`D:0RY]..-TTOQF=$,bbbCCC%%% omhI7'Sgtutsuuu-+*IJESKE(/WWWRSRW %#=);l^_KJI|||DDCwxvqqr:@E|um73.wtqtrp}s689vxxNOMABC),rpn799wGFFTbd __`+&#P_dHLK1*+)46^^^AAA)))dhh \nocjjGFD)*+?CA946,46RRRNMM'''VVV  ___EEE"!eeb ``` TTT ghhWVV e_Uba`.))ca_55<b\R RSRfdc%-1\VPRVW ccc]]]WMDinm1%TUU]XUKOO)),VVVRTTooo"""  } }}}   dddk[QQQ \\\'jjjlll  D,AE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-B$"ooozzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvvv{{{{{{{{ TTTaaa/// kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-   gpodder-3.5.2/tools/win32-launcher/gpo.res0000644000175000017500000030306412220076757017774 0ustar thpthp00000000000000 h (  -+% 3.+9,5;;+8U<+9c7,5U=RqPm~Xy]`uSq  ?*<tPoWZ\[wSs`C]nNjgHc`C]cF_[BX ""?)<C:08111111$%%!""000%%%+++555K CSSSu4$22!/TTTjjjVUU111DDDg;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW ( @ ##")'%,)! ,*& /+$ 1.'/.(.,*i)(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:C8@9::-./2-*!;,7E0B[?XlLhyVu]}adfgV>S C-AtRpgd`][[\\\eJa!""888''&*)) ...221 !"*+*79;?*< Z>VcWXYYZZZ[[pVm+*)$$$,,+(''!! 00.%%$///$$%$#"?)<V;ScWWY\]^]ZW`E]  $#H0Fŏge^wUslMieGbaD^cF`lNi^}W>T?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=G8E$$#543...777 &%%CB@@?>100+,,322 :;;;<=4,2>)=H=F@?>?BB;;;./0##$:::999>??565(('@*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;% (0` *%$$$2).-"/-) **% ''' )%% [!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,9PNMBCE***EEEg )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<8/5-./&&& )))k /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^7%5 m >)g[WWWWWWWWWWXXXXweuLMNDDDMLJ./.***DEFPLI***EGHEEDNNL..-SRQ(&&EEE52/DFE"##)('KLMRRP9:: ?(??)=߉c]V~V~WY\_abba^ZWV~9&6  @);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckc6$4#"?)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=1(0/0/*+,*))...0/.CCC*** 210244++*-./234***+-.>>?345#">)=>*=5A8?///333899:==567788***((($$%665:<=GFDFFE"#$553567 10.:08?*<7KBJ++)'((-02 )*)/// !!!))* qrsm$"^SYIHGRTT]ZXXURTSQ121>>>MPQFIJ.-,LMN244555---)('@CC676))'EGH,,,111   [[[;*(*(*(*(!DDDKKKKKKKKK444(((QQQQQQPPPDDDZZZSA ͏*(V~WWV~0.kkk!!!;abbb...---U]]]{{{sKnWWkFf9OOO0003vvvIIIppp}}}aaaI0FWW5"2 (((NNNk7ZZZ|||'%WT{ ---///;===U|iEe+++ 333***aaa"""SyO3Kaaa>>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<>>3,%# ,*#.-(1-'0.(2/)#2/*'20++20*/20*320+531,96//G7.2U8-3_:,5k:,6q:,6u:-6}:-6}:,6kfeffiTVVGJKKJI//////5)' .-%//)%10*/20+931+?31,E8.2c;,6<+9=*:>*;>*<>*<>*<>*<>*<>*<>*****==898%%%'''367430 >@A===(%#&)++,,*+,$"!"""<<<)))+)&875HHH*+)%(*:::'&?*=fGbnXWWWWZ]`bdefedc_[WWW/-@);?)=X)=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~m&% 1 /?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`VNU:::643.-,vtp889RQONPQdca&&&""!=>?VTQWUR(+,ABCutp<<=ZYVLLL222WVS987##"QPP?ABhhk58:9871 />)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=##  '''010--- .-,)*+AA@9::4440 .?)=>*=;58 9;?<96.//.00(+, @AC0//%'(111888 '''::9556974???BDE###;:9TRP,+?**Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( ( iG<872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! g ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)  g  7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+QTU $&ABBUUUdddMMMg)&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+Coj`IIHZcj@;4ijj/7;59=AAA___g "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:upvH@fn}hjjPPP<<BBB```i%(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****;>*<>***;>*<>**;>**=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\6$4 k"" $>*;>*>>%%%mjf()(0 q}&,1uuy_dhgA+<?*;6OPN279stoB=:886TTQ)%"%%#>?@+*)xxxVZb753___wwwAAA&$"MRR _``___FFEEDC5/+___:::BBAhe`_eg00/DJT'$||| WVR<<;468hltSY\g?*<?*>>`ab"(.eb]fff```;:8UPKADG[`d```9::AEF [[[   *($ g?*='>*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\6$46:= 888  g>)<%?*```jjhQGB0*'^^^_`c```behrlf655000ZYVEBAJII behAAA<, cmi!.slfUWXkpp456567```~yea\QTT  y@*<?);?))<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?V~q}RRR###HFE877<)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>lck===<;:50*28="""CDC#(+63/<<<:73 &*===B;5]]^656RRR%"b`^KJJ72,49=IIH,25% 69<<==:;:579000000gea=KS)))vxx59< NNN%$?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*< aaa FFFeee %$>)<=%=='=>*=o>*=&$?)<>+>1>*=K@E}&/6IIIEKSvogpkiGNRkgeWZZX[\ca_7CK322hhhDFKtnifdd)16!!!bbbrrr%%%???221888^^^oiapv{367345IHG~yu)-1C>8NNNdddojb==>%$?*<9?+<%?* >*<7?*@BhmpKKK 444HDB*>>*=?*=8+.,38 >>> &"9AF??>#:?C  QQQLLL888A;5%-ABC 3' ??@SRQ**,40-&-SSS:::JJJ"2:@;73&!!!TTT./0 e ] [=);?*=memQIDJB>qqq,,+MOPABAEGGihezr997EC@ug`uqjSMG0/.::: ]YS:>@HHHBGJobV2DRGEC[^_ cc`D:0RY]..-TTOQF=$,bbbCCC%%% omhI7'Sgtutsuuu-+*IJESKE(/WWWRSRW %#=);l^_KJI|||DDCwxvqqr:@E|um73.wtqtrp}s689vxxNOMABC),rpn799wGFFTbd __`+&#P_dHLK1*+)46^^^AAA)))dhh \nocjjGFD)*+?CA946,46RRRNMM'''VVV  ___EEE"!eeb ``` TTT ghhWVV e_Uba`.))ca_55<b\R RSRfdc%-1\VPRVW ccc]]]WMDinm1%TUU]XUKOO)),VVVRTTooo"""  } }}}   dddk[QQQ \\\'jjjlll  D,AE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-BE-B$"ooozzzzzzzzzzzzzzzzzzzzzzzzzzzzzzvvv{{{{{{{{ TTTaaa/// kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-   L  h  00 %@@ (B (gpodder-3.5.2/tools/win32-launcher/gpodder.c0000644000175000017500000001613712220076757020266 0ustar thpthp00000000000000 /** * gPodder - A media aggregator and podcast client * Copyright (c) 2005-2013 Thomas Perl and the gPodder Team * * gPodder is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * gPodder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . **/ /** * gPodder for Windows * Thomas Perl ; 2011-11-06 **/ #include #include #include #include #include #include "gpodder.h" #include "downloader.h" #include "folderselector.h" #if defined(GPODDER_GUI) # define MAIN_MODULE "bin\\gpodder" #else # define MAIN_MODULE "bin\\gpo" #endif #define PYTHON_INSTALLER_FILE "python-2.7.2.msi" #define PYTHON_INSTALLER_SIZE 15970304L #define PYGTK_INSTALLER_FILE "pygtk-all-in-one-2.24.0.win32-py2.7.msi" #define PYGTK_INSTALLER_SIZE 33583548L #define PYTHON_INSTALLER_URL \ "http://python.org/ftp/python/2.7.2/" \ PYTHON_INSTALLER_FILE #define PYGTK_INSTALLER_URL \ "http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.24/" \ PYGTK_INSTALLER_FILE #define LOOKUP_FUNCTION(x) {x = GetProcAddress(python_dll, #x); \ if(x == NULL) {BAILOUT("Cannot find function: " #x);}} const char *FindPythonDLL(HKEY rootKey) { static char InstallPath[MAX_PATH]; DWORD InstallPathSize = MAX_PATH; HKEY RegKey; char *result = NULL; if (RegOpenKeyEx(rootKey, "Software\\Python\\PythonCore\\2.7\\InstallPath", 0, KEY_READ, &RegKey) != ERROR_SUCCESS) { return NULL; } if (RegQueryValueEx(RegKey, NULL, NULL, NULL, InstallPath, &InstallPathSize) == ERROR_SUCCESS) { strncat(InstallPath, "\\python27.dll", sizeof(InstallPath)); result = InstallPath; } RegCloseKey(RegKey); return result; } int main(int argc, char** argv) { char path_env[MAX_PATH]; char current_dir[MAX_PATH]; char *endmarker = NULL; const char *dll_path = NULL; const char *target_folder = NULL; char tmp[MAX_PATH]; int force_select = 0; int i; void *MainPy; void *GtkModule; int _argc = 1; char *_argv[] = { MAIN_MODULE }; TCHAR gPodder_Home[MAX_PATH]; TCHAR Temp_Download_Filename[MAX_PATH]; HMODULE python_dll; FARPROC Py_Initialize; FARPROC PySys_SetArgvEx; FARPROC PyImport_ImportModule; FARPROC PyFile_FromString; FARPROC PyFile_AsFile; FARPROC PyRun_SimpleFile; FARPROC Py_Finalize; #if defined(GPODDER_CLI) SetConsoleTitle(PROGNAME); #endif for (i=1; iruzÍvkĴ@HuĴ@$ȴ@HPfĴ@tĴ@f$ȴ@GRސQP=L$ r -=w) XYÐD$,D$ D$(D$D$$D$D$ $ÐVS$\$0t$4D$8T$@hS(J uZ9Z~uJ ZCZ([Ív L$$T$DT$ZCZ([fUWVSLD$։ˍD$|$$l$l$,D$ D$(fD$\$Fvl$} ~Ol$} |$|$ tz 7 \$(F Ӄ1͉1 u;t$$w|$,u |$o ~ .Fl$l$ ׃ tvH׃ u11Ʌu;t$$w l$} x0fKT$PL$T ɉNyfD$vfD$\$;t$$kl$(+T$$L$L$C ~‹D$%lgfffD$D$)*EGgfff)ʉu;l$(D$()CD$2D$ D$ ND$ @Tڸ0C XoC~%CtHCfڸ0PCPS;t$$v5l$$v-9v!N.uvڸ0C PS C P{Kt$]l[^_]ÐCڸ-D$D$ T$T$fD$?PSfڸ dCPSST$ ڸ+<ڸ +fD$Z؉ٺ8@f19ٺ<@&CD$T$>T$$~8D$>.t$@T$?0|$|$ ~k fD$gD$ut$?T$$UWVS|$$$0$U@l1t01؃$T$<$T$@D$DD$HD$LfD$PD$T$T$XD$\$L$,F%$D$@D$HD$DL$DL$(11ɄtpC Z9/5T$(t#T$(T$T$DPЋT$(uv1HD$T|[^_]ÍT$< $l@fCv;lL$@!zfu$9D$@uU1ɉT$`L$dl$<,$xvt  ET$T[vvhjfD$@ D$@u EUM$T$L$D$<fD$@ D$@u EUM$T$L$D$<fD$@ D$@u EUM$T$L$D$<jfL$@UED$`l$dՍL$1vƀ~tB9|$Xv),$L$xؿ<[^_]1vD$T<[^_]ËD$TO<[^_]ÍvD$cvt$Xt41t$.ǀ|-t/9|$Xv,$L$x1<[^_]OkWVS@Ët$P|$Tu 1@[^_ÍvtlD$<|$X|$<tPD$=D$\$D$ D$192u9r[^_[^_ÍvUWVSLt$`\$d\$4$F1F$D$4x FD$8ntt$2\$8 5)ыl$HR`jv 6FZhv@N^n&:Lh~ (6HXn~ &.6>HR`jv 6FZhvRegCloseKeyRegCreateKeyARegOpenKeyExARegQueryValueExARegSetValueExA{CreateDirectoryADeleteCriticalSectionEnterCriticalSectionExitProcessGetEnvironmentVariableAGetFileAttributesAGetLastErrorGetModuleHandleAAGetProcAddressInitializeCriticalSectionInterlockedExchangeIsDBCSLeadByteEx.LeaveCriticalSection1LoadLibraryA\MultiByteToWideCharSetCurrentDirectoryA&SetEnvironmentVariableAtSetUnhandledExceptionFilterSleepTlsGetValueVirtualProtectVirtualQueryWideCharToMultiByte7__getmainargsA__mb_cur_maxM__p__environO__p__fmodec__set_app_type_cexit_errno _iob_onexit_setmodeGabortNatexitPatoiScalloc\exit_fclosejfopenlfputcqfreeyfwrite}getenvlocaleconvmallocsetlocalesignalstrcatstrchrstrncpystrrchrvfprintfwcslenECoTaskMemFree<SHBrowseForFolderAXSHGetFolderPathAeSHGetPathFromIDListAShellExecuteAPCreateDialogParamADestroyWindowDispatchMessageAGetDlgItem%GetMessageAMessageBoxAPeekMessageASendMessageA`TranslateMessagetInternetCloseHandleInternetOpenAInternetOpenUrlAInternetReadFileADVAPI32.DLLKERNEL32.dll(((((((((((((((((((((((((((((((msvcrt.dll<OLE32.dllPPPPSHELL32.DLLdddddddddUSER32.dllxxxxWININET.DLL%@%@@@@@f SO(f SO`xf SOLf SO\f SOlf SO|f SOf SO8f SOf SO f SOPROGRESShYH!$%t,(Bn(v8wL(  -+% 3.+9,5;;+8U<+9c<+9i<+9i<+8c;+7Y9,5I6.0520*#1/)-+$ U=RqPm~Xy]`aa`]Y{xTtnNjV>R7,23?*<tPoWZ\[YYYZZ[\_hId`C]nNjgHc`C]cF_tRp߆XWZvRrtPpXz`uRq?)<C>+<]WqNm)>*=?)<-R8OspK CSSSuyOszPt}7Ug;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW( @ ##")'%,)! ,*& /+$ 1.'/.(.,*2-(30'31'31'30'2-(.,)/.(0.'.+$ ,+' *( )(#%")(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:=*:=+:=+:=+:=+:<+9<,8;,7:,6{8.3i50/O31+C31+;20*320*)0.&)' 2-*!;,7E0B[?XlLhyVu]}adfgggfec`\|zXvsRojKg_B\P7M@-=;-650.[31+?.-'C-AtRpgd`][[\\\\\\\\\\]^`cfevTrQ8N<*:k&$?*< Z>VcWXYYZZZ[[[[\\\\\\\\\\\_gfGb?*=Y?)<V;ScWWY\]^]ZWWWWWXXXYZ[[\\\\gL4JH0Fŏge^wUslMieGbaD^cF`lNi^}`WWWWWW^bb`][[\dZ>W?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=jLg^WWWWeiJeW;TV;S^B[mMi[{fdfX=U>)=K3HˏeWWW`bE_>*=G>)<>)=>*=?)<;?)K?*<Q?PG7w5)3ZWWV~I3G]]],,,% =iddd?{eMMMT7PWWZ;Vvvvc鍍aaaKKKcg{{{MMMCCC6,4V~U}706eee_YYY;@@@edewNqeB` NNN/$$$hhh^=ZB+?u###111Q5M3$1***ccc]N3K6+5C&&&X9T6+5'eiiiwwwmGh3$1]]]UUU=7*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;(0` *%$$$2).-"/-) **% ''' )%% 5'% 4.# 22" 22" 22" 22" 4.# 5'% *&& ((& ++& .-) .."/)$$$*%!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,930,941,951,741+741+741+531+520*531*321+330+120+/20)+20))1/+'2/*#0/'/-)0.(.,&/.%'&" '"  )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;>*;=*;=+:<+9<,8;,7:-58/3s51.Y41+O32+K31+G31+A31+;21+31/('/.''% /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^^^__``abcefhikmkauSq_B\G0E>*;:,630+30/)('"  >))<:(6 ?*< A+?g^XXYYZ[[[[\[\\[\\[\\[\\[\\[[\[[\[\^gkdEa?*=>)= ?); @+>g[WWWWWWWWWWXXXXYYYZZZ[[[\\\\\[\\\\\\_lZ>W?*<{?(??)=߉c]V~V~WY\_abba^ZWV~WV~V~V~V~V~WWWWWXYZ[[[[\[[\c]~?)=@);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckcXWV~WWWWWV~WWZ]][YYZ[\[\^hA+??)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=lNifV~VWVVWafZ>WC-A?*=>*G0ET9QfGb{Wvhkfce?*=>)=>*=5N5KkWWWV~WXlR8P>*=?*<<(<<*<?)= >*=?)>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<*;>*<>*<>*<>*<>*<>*<>**<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<+9;,7:-58/2u51.]41+U41+S32,O41,M31+I31,C31+?31+72/)/10)#/,'&& .+%2/()30*=5/.U;,7=+:>*XT9QM3JF.CA+?@*>?*=>*<=+:;,78.251-c41+]32,Y31+S31+I20*;0/)',*#.*$6-03=+9>*>*<<+98.2s31,K30+A21*3//)!+(#;)7)>**)<>);_?*<?**<[?*<?*)=?*=!?); ?))=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~mbWWWWWWWWWWWXahlnnlkgc_ZYZ[\\\kuRq?*=?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`l`WWWWWWWWW\lk\}oNkhHdhHdmMjvTr^glnkf`\\[ksQo>)=>)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=rRnkXWWWWWWWZm`P6M?*=>)<>)<>)=>*=>*=?*=C,AN5L_A\uSqcmmicmkKg?)=?)=>*=T:QnZWWWWWWWfhI1G>*=?*<9>)< >*= >*=?*=-?)<[?)<>*)<@*;?)=?*=U?*I1FK2H?*=gWfS-U]/..>*<\@YnZWWWWWW[nY=V>)<?)=?**<{>*Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( <872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! 8!! 8)! 8*! 6. 66 55 33 33 33 33 33 33 33 33 55 66 6. 8*! 8)! 8!! .!! ,"" #"" """ $$$ %%% %%% ''' +++ +++ +++ --- 2222871 ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)4+)2+(2+'2.'31'21&10&10&10&11&10&10&10&10&21&31'2.'2+'2+(4+)3+).+)++*,**,++,,'--$//%00&11'3-(-*)-,(..00 1/!.%#$$$&&% ))' ,,) .,+ .." 21 ,&  ###'''** 1   7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+30*+21)+11)+21)+41(-41(-30*-30*-30*-32*-30*-30*-30*-41*-41(-41(-21)+11)+21)+30*+30*+30++40+)3.+)1/,)00*)1/*'2.*'0/('00)%10+%3/*#10.%!3/'!1/(/.*0.,.-+//%22'4-),,&--$1+$)''))%--%1,)..(11 (!! %%% +++ // !!$ )&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+C30+C30,E21-E41-C51-C51-A51-A41,A40,A42,A40,A40,A41,A41,?41,?51,?31,?11,?21*?20*?20*?21*=32*=32+=33+;31+;40,;40,;31,921,93/+730+720*510+521)532)331*131+120+/3.*-00*+20*+10))3/')10)'20+%1.*#0/(!1.*/.%0/&-+*--&2/(.,'-'!'&%,,( 2+ & &&  "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:=+:=+:=+:=+:=+:=+:=+:=+:=,9=,9=+8<,8<-8;-7<.7<-5:.59.4w8.3q7.1i6.0a4.-U41+O42+O32+O21+M22,M33,M32,K42-K40-K31,I42+I40+G41,G30+E31)E32+C22+C42,A41,?40+?10+=30*;31*931*731+540+320+310(/21(-30++1.*'00*%11/)!--*22(/,#,*#.."+# ++ %(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<,9<-7:.69-59-49.3y8/2s701k61/a50,Y41+U42,S33,S42,Q41-Q51+O42,M30+M41*K22+I33,G41,E31+C40*A22*?31+=30,;20+731*520+120+-2.()0-(%1.(.-(/+$,)$''  (#" ,,!//%/.'!/.('00+/20,511+;31+?21+C32+E42+I31+K31-S8.2q<,7=+9=+;>*;>*<>*)<>*<>*<=*;=+:=+:<,9;-79.5800u41,_41,[52,[41+Y42,Y33-W33+U41,U42,S41+Q41+O32,M42,K40+I41+E31,C31+?10)93.)522)-11*'//)2*(((#&&  ### -&!0.&10(!3.(+21(521)=22+E21+I31,Q6/0e:-4<,8=*;>*XX;UT9QP5MM3JJ1GG/DD-BA+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*<=+:;,7:-58/2{62-g42+_41,_52,]32,]32+[42,Y32,W32+U32,S31+O31+I31,C21*=3/*310*)..(**&*& '' ! **.-)10)%2/(/30*;30+C5/-S8-4u=+9>*;>*<>*?*=?*=?*=?*=?)=>)<>*;=+;<,89.470/o51-e52+_41+]42,[33+Y41+W41+S31,O41+I31+A20)92/*//,(#--#-) $$! $$$ ,(!0,'1/(#2.)-5/-E;,7=*;?*=?*=?*=?*=@*=H0EU9RcC_tQpZ|ejnoooooooooooooooooonmmmmmmmmmmmmmmnnooooooooooooooooooooooonljhc\}xTtoMkcC_Y*<=+::-6700k31,Y31+U32,Q31+O31+K31,E32+=3/*500)+//'!--&,%(( ""+%% /-"3.+;*7]>*;>**<>*;<+88.2m41-K30+A21*=3/+922*121()11*!-+))%%((  + 4),=*;y>*=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]^_`acdefhjkmoooooooonjbxUtcD_Q6N@*>?*=?*=?*=>*<=*:8,5[10)+0.)'20&!/.)/,&((%((# "" $>*;>*?*=>)<>*<<*;8*330*#''#.- ""  =*:3?*)<<(87 A+<?*)<>)<>()*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\binoofdD`@*>?*=?*)<%?*?*=>)=>+=?*<?**=?*)<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?Vgnm[WWWWWWWWWWWWWWWWWWZhnomcxStaB^R7OI1FF/DF/DF/DF/DH0EL3JS8P]>YjIfvSr[|bhlnooonmjd^\\\[ZhojQ7N?*=>)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>fIcnneWWWWWWWWWWWWWWWWWXgookpMlP5M@+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=D-AL2IW;TdE`uQp_jnoooonjfb\XjohK2I?*=?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*?*=?*=?*=?*=>)<>))=>**=>*=?*=?*=?*=?*=?*=@*>A,?K1HaA]uQp_inoononjnoaF/D?*=>)<=%=='=>*=o>*=?*=rQoon]WWWWWWWWWWWWWWWYloldEaA+??*=>*=?**=7?*=M>*=i?*<>)<>**K2HZ=WsOo`innooonwTsB,@?*=?)<>+>1>*=?*=aD^no`WWWWWWWWWWWWWWWcon|WxB,@?*=?)=>*=I>+9?)<;>*)=]?(?@*; ?*=#?)=G?*=?*=?*F.CO5LY?*=>) >*<7?*?*=?)<C,C?*=?)=%?**)<>*=?*=kZj?7 U}=>*>>*=?*=?*=]~om[WWWWWWWWWWWWWWaoolJh?*=?*<>*+=@+@ke ] [=);?*=J1HkoiYWWWWWWWWWWWWWWconaB]?*=9&7 cEG?)_W %#=);cE`nndWWWWWWWWWWWWWWWeomV:S#" 3g'''VVV  ___EEE"!yWunn[WWWWWWWWWWWWWWWflaG^ """  } }}}L7ImkWWWWWWWWWWWWWWWWcO:L  JJJmmm,,, /999dddk[gLdbWWWWWWWWWWWWWWWU|=+: ```  -MiQQQ oJjWWWWWWWWWWWWWWT{H/E***o !c\\\'jjjlll.,V~WWWWWWWWWWWWWZ:U  5=\\\ kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-   ȐJDownloading dependenciesMS Shell DlgP msctls_progress32X2)CancelP Please wait...P -1.40 / 32.00 MB h  00 %@@ (B (.eh_framegpodder-3.5.2/tools/win32-launcher/gpodder.h0000644000175000017500000000051112220076757020260 0ustar thpthp00000000000000#ifndef _GPODDER_H #define _GPODDER_H #define PROGNAME "gPodder" #define BAILOUT(s) { \ MessageBox(NULL, s, "Error launching " PROGNAME, MB_OK); \ exit(1); \ } #define DEBUG(a, b) { \ MessageBox(NULL, a, b, MB_OK); \ } #define GPODDER_REGISTRY_KEY \ "Software\\gpodder.org\\gPodder" #endif gpodder-3.5.2/tools/win32-launcher/gpodder.ico0000644000175000017500000030253612220076757020617 0ustar thpthp00000000000000 hV 00 %f@@ (B; (6}(  @-+% 3.+9,5;;+8U<+9c<+9i<+9i<+8c;+7Y9,5I6.0520*#1/)-+$ U=RqPm~Xy]`aa`]Y{xTtnNjV>R7,23?*<tPoWZ\[YYYZZ[\_hId`C]nNjgHc`C]cF_tRp߆XWZvRrtPpXz`uRq?)<C>+<]WqNm)>*=?)<-R8OspK CSSSuyOszPt}7Ug;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW( @ ##")'%,)! ,*& /+$ 1.'/.(.,*2-(30'31'31'30'2-(.,)/.(0.'.+$ ,+' *( )(#%")(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:=*:=+:=+:=+:=+:<+9<,8;,7:,6{8.3i50/O31+C31+;20*320*)0.&)' 2-*!;,7E0B[?XlLhyVu]}adfgggfec`\|zXvsRojKg_B\P7M@-=;-650.[31+?.-'C-AtRpgd`][[\\\\\\\\\\]^`cfevTrQ8N<*:k&$?*< Z>VcWXYYZZZ[[[[\\\\\\\\\\\_gfGb?*=Y?)<V;ScWWY\]^]ZWWWWWXXXYZ[[\\\\gL4JH0Fŏge^wUslMieGbaD^cF`lNi^}`WWWWWW^bb`][[\dZ>W?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=jLg^WWWWeiJeW;TV;S^B[mMi[{fdfX=U>)=K3HˏeWWW`bE_>*=G>)<>)=>*=?)<;?)K?*<Q?PG7w5)3ZWWV~I3G]]],,,% =iddd?{eMMMT7PWWZ;Vvvvc鍍aaaKKKcg{{{MMMCCC6,4V~U}706eee_YYY;@@@edewNqeB` NNN/$$$hhh^=ZB+?u###111Q5M3$1***ccc]N3K6+5C&&&X9T6+5'eiiiwwwmGh3$1]]]UUU=7*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;(0` %*%$$$2).-"/-) **% ''' )%% 5'% 4.# 22" 22" 22" 22" 4.# 5'% *&& ((& ++& .-) .."/)$$$*%!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,930,941,951,741+741+741+531+520*531*321+330+120+/20)+20))1/+'2/*#0/'/-)0.(.,&/.%'&" '"  )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;>*;=*;=+:<+9<,8;,7:-58/3s51.Y41+O32+K31+G31+A31+;21+31/('/.''% /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^^^__``abcefhikmkauSq_B\G0E>*;:,630+30/)('"  >))<:(6 ?*< A+?g^XXYYZ[[[[\[\\[\\[\\[\\[\\[[\[[\[\^gkdEa?*=>)= ?); @+>g[WWWWWWWWWWXXXXYYYZZZ[[[\\\\\[\\\\\\_lZ>W?*<{?(??)=߉c]V~V~WY\_abba^ZWV~WV~V~V~V~V~WWWWWXYZ[[[[\[[\c]~?)=@);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckcXWV~WWWWWV~WWZ]][YYZ[\[\^hA+??)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=lNifV~VWVVWafZ>WC-A?*=>*G0ET9QfGb{Wvhkfce?*=>)=>*=5N5KkWWWV~WXlR8P>*=?*<<(<<*<?)= >*=?)>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<*;>*<>*<>*<>*<>*<>*<>**<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<+9;,7:-58/2u51.]41+U41+S32,O41,M31+I31,C31+?31+72/)/10)#/,'&& .+%2/()30*=5/.U;,7=+:>*XT9QM3JF.CA+?@*>?*=>*<=+:;,78.251-c41+]32,Y31+S31+I20*;0/)',*#.*$6-03=+9>*>*<<+98.2s31,K30+A21*3//)!+(#;)7)>**)<>);_?*<?**<[?*<?*)=?*=!?); ?))=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~mbWWWWWWWWWWWXahlnnlkgc_ZYZ[\\\kuRq?*=?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`l`WWWWWWWWW\lk\}oNkhHdhHdmMjvTr^glnkf`\\[ksQo>)=>)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=rRnkXWWWWWWWZm`P6M?*=>)<>)<>)=>*=>*=?*=C,AN5L_A\uSqcmmicmkKg?)=?)=>*=T:QnZWWWWWWWfhI1G>*=?*<9>)< >*= >*=?*=-?)<[?)<>*)<@*;?)=?*=U?*I1FK2H?*=gWfS-U]/..>*<\@YnZWWWWWW[nY=V>)<?)=?**<{>*Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( <872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! 8!! 8)! 8*! 6. 66 55 33 33 33 33 33 33 33 33 55 66 6. 8*! 8)! 8!! .!! ,"" #"" """ $$$ %%% %%% ''' +++ +++ +++ --- 2222871 ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)4+)2+(2+'2.'31'21&10&10&10&11&10&10&10&10&21&31'2.'2+'2+(4+)3+).+)++*,**,++,,'--$//%00&11'3-(-*)-,(..00 1/!.%#$$$&&% ))' ,,) .,+ .." 21 ,&  ###'''** 1   7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+30*+21)+11)+21)+41(-41(-30*-30*-30*-32*-30*-30*-30*-41*-41(-41(-21)+11)+21)+30*+30*+30++40+)3.+)1/,)00*)1/*'2.*'0/('00)%10+%3/*#10.%!3/'!1/(/.*0.,.-+//%22'4-),,&--$1+$)''))%--%1,)..(11 (!! %%% +++ // !!$ )&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+C30+C30,E21-E41-C51-C51-A51-A41,A40,A42,A40,A40,A41,A41,?41,?51,?31,?11,?21*?20*?20*?21*=32*=32+=33+;31+;40,;40,;31,921,93/+730+720*510+521)532)331*131+120+/3.*-00*+20*+10))3/')10)'20+%1.*#0/(!1.*/.%0/&-+*--&2/(.,'-'!'&%,,( 2+ & &&  "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:=+:=+:=+:=+:=+:=+:=+:=+:=,9=,9=+8<,8<-8;-7<.7<-5:.59.4w8.3q7.1i6.0a4.-U41+O42+O32+O21+M22,M33,M32,K42-K40-K31,I42+I40+G41,G30+E31)E32+C22+C42,A41,?40+?10+=30*;31*931*731+540+320+310(/21(-30++1.*'00*%11/)!--*22(/,#,*#.."+# ++ %(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<,9<-7:.69-59-49.3y8/2s701k61/a50,Y41+U42,S33,S42,Q41-Q51+O42,M30+M41*K22+I33,G41,E31+C40*A22*?31+=30,;20+731*520+120+-2.()0-(%1.(.-(/+$,)$''  (#" ,,!//%/.'!/.('00+/20,511+;31+?21+C32+E42+I31+K31-S8.2q<,7=+9=+;>*;>*<>*)<>*<>*<=*;=+:=+:<,9;-79.5800u41,_41,[52,[41+Y42,Y33-W33+U41,U42,S41+Q41+O32,M42,K40+I41+E31,C31+?10)93.)522)-11*'//)2*(((#&&  ### -&!0.&10(!3.(+21(521)=22+E21+I31,Q6/0e:-4<,8=*;>*XX;UT9QP5MM3JJ1GG/DD-BA+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*<=+:;,7:-58/2{62-g42+_41,_52,]32,]32+[42,Y32,W32+U32,S31+O31+I31,C21*=3/*310*)..(**&*& '' ! **.-)10)%2/(/30*;30+C5/-S8-4u=+9>*;>*<>*?*=?*=?*=?*=?)=>)<>*;=+;<,89.470/o51-e52+_41+]42,[33+Y41+W41+S31,O41+I31+A20)92/*//,(#--#-) $$! $$$ ,(!0,'1/(#2.)-5/-E;,7=*;?*=?*=?*=?*=@*=H0EU9RcC_tQpZ|ejnoooooooooooooooooonmmmmmmmmmmmmmmnnooooooooooooooooooooooonljhc\}xTtoMkcC_Y*<=+::-6700k31,Y31+U32,Q31+O31+K31,E32+=3/*500)+//'!--&,%(( ""+%% /-"3.+;*7]>*;>**<>*;<+88.2m41-K30+A21*=3/+922*121()11*!-+))%%((  + 4),=*;y>*=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]^_`acdefhjkmoooooooonjbxUtcD_Q6N@*>?*=?*=?*=>*<=*:8,5[10)+0.)'20&!/.)/,&((%((# "" $>*;>*?*=>)<>*<<*;8*330*#''#.- ""  =*:3?*)<<(87 A+<?*)<>)<>()*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\binoofdD`@*>?*=?*)<%?*?*=>)=>+=?*<?**=?*)<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?Vgnm[WWWWWWWWWWWWWWWWWWZhnomcxStaB^R7OI1FF/DF/DF/DF/DH0EL3JS8P]>YjIfvSr[|bhlnooonmjd^\\\[ZhojQ7N?*=>)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>fIcnneWWWWWWWWWWWWWWWWWXgookpMlP5M@+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=D-AL2IW;TdE`uQp_jnoooonjfb\XjohK2I?*=?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*?*=?*=?*=?*=>)<>))=>**=>*=?*=?*=?*=?*=?*=@*>A,?K1HaA]uQp_inoononjnoaF/D?*=>)<=%=='=>*=o>*=?*=rQoon]WWWWWWWWWWWWWWWYloldEaA+??*=>*=?**=7?*=M>*=i?*<>)<>**K2HZ=WsOo`innooonwTsB,@?*=?)<>+>1>*=?*=aD^no`WWWWWWWWWWWWWWWcon|WxB,@?*=?)=>*=I>+9?)<;>*)=]?(?@*; ?*=#?)=G?*=?*=?*F.CO5LY?*=>) >*<7?*?*=?)<C,C?*=?)=%?**)<>*=?*=kZj?7 U}=>*>>*=?*=?*=]~om[WWWWWWWWWWWWWWaoolJh?*=?*<>*+=@+@ke ] [=);?*=J1HkoiYWWWWWWWWWWWWWWconaB]?*=9&7 cEG?)_W %#=);cE`nndWWWWWWWWWWWWWWWeomV:S#" 3g'''VVV  ___EEE"!yWunn[WWWWWWWWWWWWWWWflaG^ """  } }}}L7ImkWWWWWWWWWWWWWWWWcO:L  JJJmmm,,, /999dddk[gLdbWWWWWWWWWWWWWWWU|=+: ```  -MiQQQ oJjWWWWWWWWWWWWWWT{H/E***o !c\\\'jjjlll.,V~WWWWWWWWWWWWWZ:U  5=\\\ kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-   gpodder-3.5.2/tools/win32-launcher/gpodder.res0000644000175000017500000030363412220076757020636 0ustar thpthp00000000000000 h (  -+% 3.+9,5;;+8U<+9c<+9i<+9i<+8c;+7Y9,5I6.0520*#1/)-+$ U=RqPm~Xy]`aa`]Y{xTtnNjV>R7,23?*<tPoWZ\[YYYZZ[\_hId`C]nNjgHc`C]cF_tRp߆XWZvRrtPpXz`uRq?)<C>+<]WqNm)>*=?)<-R8OspK CSSSuyOszPt}7Ug;BBBxxxeMbhSfӒҁ7W iiiOOOp}rrrGGGlll???5q ~~~rYYYFFFppp߃iSf~ gggwww񑑑퍊uMpdKaMMMk/]]]VAT_dF`^^^gxxxQllllllf\e|z|cccqW ( @ ##")'%,)! ,*& /+$ 1.'/.(.,*2-(30'31'31'30'2-(.,)/.(0.'.+$ ,+' *( )(#%")(! /-(20*)4/-;9-5_;+7}<+9<+:=*:=*;=+:=*:=+:=+:=+:=+:<+9<,8;,7:,6{8.3i50/O31+C31+;20*320*)0.&)' 2-*!;,7E0B[?XlLhyVu]}adfgggfec`\|zXvsRojKg_B\P7M@-=;-650.[31+?.-'C-AtRpgd`][[\\\\\\\\\\]^`cfevTrQ8N<*:k&$?*< Z>VcWXYYZZZ[[[[\\\\\\\\\\\_gfGb?*=Y?)<V;ScWWY\]^]ZWWWWWXXXYZ[[\\\\gL4JH0Fŏge^wUslMieGbaD^cF`lNi^}`WWWWWW^bb`][[\dZ>W?)< ?*=;D-BA+?>*=}>**<7>*)=?)<>*=/?*=jLg^WWWWeiJeW;TV;S^B[mMi[{fdfX=U>)=K3HˏeWWW`bE_>*=G>)<>)=>*=?)<;?)K?*<Q?PG7w5)3ZWWV~I3G]]],,,% =iddd?{eMMMT7PWWZ;Vvvvc鍍aaaKKKcg{{{MMMCCC6,4V~U}706eee_YYY;@@@edewNqeB` NNN/$$$hhh^=ZB+?u###111Q5M3$1***ccc]N3K6+5C&&&X9T6+5'eiiiwwwmGh3$1]]]UUU=7*=% E3%%%888{jyjVhbbb k%NNNdddXXX...VVVSU~~~} 1E;% (0` *%$$$2).-"/-) **% ''' )%% 5'% 4.# 22" 22" 22" 22" 4.# 5'% *&& ((& ++& .-) .."/)$$$*%!%#*%" -,%.+%1.)0-)1/(1/*#10*'20))20)-30+/30+130,740,930,941,951,741+741+741+531+520*531*321+330+120+/20)+20))1/+'2/*#0/'/-)0.(.,&/.%'&" '"  )( .-'1/))20*331+;6/0Q:,6u;+8=+:=*;=*;>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;>*;=*;=+:<+9<,8;,7:-58/3s51.Y41+O32+K31+G31+A31+;21+31/('/.''% /-&2/)38-3m<+9?**;I1FiIe_klifdb``_^^^^^__``abcefhikmkauSq_B\G0E>*;:,630+30/)('"  >))<:(6 ?*< A+?g^XXYYZ[[[[\[\\[\\[\\[\\[\\[[\[[\[\^gkdEa?*=>)= ?); @+>g[WWWWWWWWWWXXXXYYYZZZ[[[\\\\\[\\\\\\_lZ>W?*<{?(??)=߉c]V~V~WY\_abba^ZWV~WV~V~V~V~V~WWWWWXYZ[[[[\[[\c]~?)=@);?)=zVvhfjmkd\|yWuuSprQnsSoyXuckcXWV~WWWWWV~WWZ]][YYZ[\[\^hA+??)< >*=eN4KpOlhIeZ>WM3JC,@?*=>)*<>)=>)<>**<[?*=3?)<=,<?*='?*=lNifV~VWVVWafZ>WC-A?*=>*G0ET9QfGb{Wvhkfce?*=>)=>*=5N5KkWWWV~WXlR8P>*=?*<<(<<*<?)= >*=?)>>CCC'''nnnwNr<':CCC9uLp1 /444iUzPu-+OmBBBZZZT{1 /3%yyy V~=(:+++7$5WR6OUUUOOO*** iUUU...c@^WrJm333\\\9OOO񳳳U|WV}YYYqqq ))) dA`WWWaE^,,,)))aaarrr---q PPPRRR ]DZZV~VZd>>>uuuEEEg#$$$:::ac6$4yWu`V~WegJc<(:y襤FFF ?*=YW=TiX^gD.B>*=eřGp`n @*=vVrljU;S>*=W㸸՜ wwwƥS@QT:QJ2GZHX?yooo ///hhhľggg222 ------ 'dddHHH<<*;>*<>*<>*<>*<>*<>*<>**<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<+9;,7:-58/2u51.]41+U41+S32,O41,M31+I31,C31+?31+72/)/10)#/,'&& .+%2/()30*=5/.U;,7=+:>*XT9QM3JF.CA+?@*>?*=>*<=+:;,78.251-c41+]32,Y31+S31+I20*;0/)',*#.*$6-03=+9>*>*<<+98.2s31,K30+A21*3//)!+(#;)7)>**)<>);_?*<?**<[?*<?*)=?*=!?); ?))=kC-A_lhayVukKg^@ZS8PJ1GB,??*=>*<>)=?*=?*=?)<@+>K4IaF^`~mbWWWWWWWWWWWXahlnnlkgc_ZYZ[\\\kuRq?*=?*=?*<?*=B,@J1HE-B?*=>*=?)=>)*<_?)*<9>)=+?*>%?*='?)<3?*)=u?*<@+>cG`l`WWWWWWWWW\lk\}oNkhHdhHdmMjvTr^glnkf`\\[ksQo>)=>)=>)=?*<_>*<{>**<9>*=@)=@+>>)=Q?*=rRnkXWWWWWWWZm`P6M?*=>)<>)<>)=>*=>*=?*=C,AN5L_A\uSqcmmicmkKg?)=?)=>*=T:QnZWWWWWWWfhI1G>*=?*<9>)< >*= >*=?*=-?)<[?)<>*)<@*;?)=?*=U?*I1FK2H?*=gWfS-U]/..>*<\@YnZWWWWWW[nY=V>)<?)=?**<{>*Z EEE$$$AAAwwwV}N3Jyyy777{{{U}C+@'''||| tttV}=(:333uϭ aaa#"V~=':333\\\***[ ___;;;CCC2!0WB+?'''+++FFF? H/EWO3K ccc'{^^^999eB`Wb@]S  }RxWzPt=== 3333bbb'''___///4!1V~WV}___EEEHHH000iii### iEeWWWG.DDDD<<)=?*=rRnjWWXloPk?)=>*<?7[;;;}]pppxxx'?**<m### VVVbbbs?))=N:L/Y{{{ W BBBtn^l )))_ CCCSSSyyy??? wwwGIKKKqqq oaaa777  AAAtttCS7-QskI!( ( <872200,,, +++ +++ +++ &&& %%% %%% ### """ #"" +!! -!! 8!! 8)! 8*! 6. 66 55 33 33 33 33 33 33 33 33 55 66 6. 8*! 8)! 8!! .!! ,"" #"" """ $$$ %%% %%% ''' +++ +++ +++ --- 2222871 ,,))'''###" 4' 21 ..& .,+ ,,) ((% %%%$$$/%#1/!00 --$.,(2))3-(11'00&..%--$,,+,++,**++*-+)3+)4+)2+(2+'2.'31'21&10&10&10&11&10&10&10&10&21&31'2.'2+'2+(4+)3+).+)++*,**,++,,'--$//%00&11'3-(-*)-,(..00 1/!.%#$$$&&% ))' ,,) .,+ .." 21 ,&  ###'''** 1   7!--' ))) $$$ & 00 2,)/+'--&))).('1.$--$/,)3-)11'//%-,+0.,2.*0.(3/'!10%#40.*%1/*%0/)%2/('1/*'00*'//*)1/,)2.+)40+)30++30*+30*+21)+11)+21)+41(-41(-30*-30*-30*-32*-30*-30*-30*-41*-41(-41(-21)+11)+21)+30*+30*+30++40+)3.+)1/,)00*)1/*'2.*'0/('00)%10+%3/*#10.%!3/'!1/(/.*0.,.-+//%22'4-),,&--$1+$)''))%--%1,)..(11 (!! %%% +++ // !!$ )&&&$# .- ++' '&%0'!-,'1-&-,&0*)1/&2-)10)0/)!1.*#2/*%0/('20()21*)1/*+//*-30,-21+/31+131*122)320)511+530*73/*720*931,951,941,;40,=42,?32,A31,C41,C30+C30+C30+C30,E21-E41-C51-C51-A51-A41,A40,A42,A40,A40,A41,A41,?41,?51,?31,?11,?21*?20*?20*?21*=32*=32+=33+;31+;40,;40,;31,921,93/+730+720*510+521)532)331*131+120+/3.*-00*+20*+10))3/')10)'20+%1.*#0/(!1.*/.%0/&-+*--&2/(.,'-'!'&%,,( 2+ & &&  "((( /"" --'+)'.+%11(0-*2.(!10)#20)'1-*)2/*+30)-30*/1/+340-331+721*731*930,;20+=40*?31,?32,A30,G7//W7.2c8-5o:-6{:-6;,7<+8=+9<+9=+9=+:=+:<+:<+:=+:=+9=+9=+:=+:=+:=+:=+:=+:=+:=+:=+:=,9=,9=+8<,8<-8;-7<.7<-5:.59.4w8.3q7.1i6.0a4.-U41+O42+O32+O21+M22,M33,M32,K42-K40-K31,I42+I40+G41,G30+E31)E32+C22+C42,A41,?40+?10+=30*;31*931*731+540+320+310(/21(-30++1.*'00*%11/)!--*22(/,#,*#.."+# ++ %(( **".-#-,'00(/.)%1.'+2/*/20*130)510*730+;31+=21*?40,A51+E60.Q7/2_8.4m9-4y:,6<,8=+:>+;>*<>*<>*<>*<>*<>*<>*<>*<>*<>****<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*<>*;=+:=+:<,9<-7:.69-59-49.3y8/2s701k61/a50,Y41+U42,S33,S42,Q41-Q51+O42,M30+M41*K22+I33,G41,E31+C40*A22*?31+=30,;20+731*520+120+-2.()0-(%1.(.-(/+$,)$''  (#" ,,!//%/.'!/.('00+/20,511+;31+?21+C32+E42+I31+K31-S8.2q<,7=+9=+;>*;>*<>*)<>*<>*<=*;=+:=+:<,9;-79.5800u41,_41,[52,[41+Y42,Y33-W33+U41,U42,S41+Q41+O32,M42,K40+I41+E31,C31+?10)93.)522)-11*'//)2*(((#&&  ### -&!0.&10(!3.(+21(521)=22+E21+I31,Q6/0e:-4<,8=*;>*XX;UT9QP5MM3JJ1GG/DD-BA+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*<=+:;,7:-58/2{62-g42+_41,_52,]32,]32+[42,Y32,W32+U32,S31+O31+I31,C21*=3/*310*)..(**&*& '' ! **.-)10)%2/(/30*;30+C5/-S8-4u=+9>*;>*<>*?*=?*=?*=?*=?)=>)<>*;=+;<,89.470/o51-e52+_41+]42,[33+Y41+W41+S31,O41+I31+A20)92/*//,(#--#-) $$! $$$ ,(!0,'1/(#2.)-5/-E;,7=*;?*=?*=?*=?*=@*=H0EU9RcC_tQpZ|ejnoooooooooooooooooonmmmmmmmmmmmmmmnnooooooooooooooooooooooonljhc\}xTtoMkcC_Y*<=+::-6700k31,Y31+U32,Q31+O31+K31,E32+=3/*500)+//'!--&,%(( ""+%% /-"3.+;*7]>*;>**<>*;<+88.2m41-K30+A21*=3/+922*121()11*!-+))%%((  + 4),=*;y>*=?*=?*=C-AW:SuQqclooooonlifdb`^\ZZZ[[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]^_`acdefhjkmoooooooonjbxUtcD_Q6N@*>?*=?*=?*=>*<=*:8,5[10)+0.)'20&!/.)/,&((%((# "" $>*;>*?*=>)<>*<<*;8*330*#''#.- ""  =*:3?*)<<(87 A+<?*)<>)<>()*=?*=V:SlohXWWWWWWWXXYZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\binoofdD`@*>?*=?*)<%?*?*=>)=>+=?*<?**=?*)<>))=>)=?*<@+>gFcdihe_YzsOneDbX*=>)=>)=?*=?*=?*=?*M2IW9SV9RN4KG/E@*>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=>*=>*)<>*=u>*=i>*=]?)=O?*>I?*>I>*=K?*)<]>*=m>*=}?*<>)*)=?*)<>*=>*=?)=?)=>)<>)*<+?*=?*=>*=>*< @*9<&8=2=?*<>)<?(>?)=W?*Y?Vgnm[WWWWWWWWWWWWWWWWWWZhnomcxStaB^R7OI1FF/DF/DF/DF/DH0EL3JS8P]>YjIfvSr[|bhlnooonmjd^\\\[ZhojQ7N?*=>)=>)==)=>)==?))<>)*<>**=G>*=-@)=@+>?*=O>)=?*=@+>fIcnneWWWWWWWWWWWWWWWWWXgookpMlP5M@+>?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=?*=D-AL2IW;TdE`uQp_jnoooonjfb\XjohK2I?*=?*=?*=?)<?*< ?*= ?*= >*<?*<>,;>)<%>*=>*?*=?*=?*=?*=>)<>))=>**=>*=?*=?*=?*=?*=?*=@*>A,?K1HaA]uQp_inoononjnoaF/D?*=>)<=%=='=>*=o>*=?*=rQoon]WWWWWWWWWWWWWWWYloldEaA+??*=>*=?**=7?*=M>*=i?*<>)<>**K2HZ=WsOo`innooonwTsB,@?*=?)<>+>1>*=?*=aD^no`WWWWWWWWWWWWWWWcon|WxB,@?*=?)=>*=I>+9?)<;>*)=]?(?@*; ?*=#?)=G?*=?*=?*F.CO5LY?*=>) >*<7?*?*=?)<C,C?*=?)=%?**)<>*=?*=kZj?7 U}=>*>>*=?*=?*=]~om[WWWWWWWWWWWWWWaoolJh?*=?*<>*+=@+@ke ] [=);?*=J1HkoiYWWWWWWWWWWWWWWconaB]?*=9&7 cEG?)_W %#=);cE`nndWWWWWWWWWWWWWWWeomV:S#" 3g'''VVV  ___EEE"!yWunn[WWWWWWWWWWWWWWWflaG^ """  } }}}L7ImkWWWWWWWWWWWWWWWWcO:L  JJJmmm,,, /999dddk[gLdbWWWWWWWWWWWWWWWU|=+: ```  -MiQQQ oJjWWWWWWWWWWWWWWT{H/E***o !c\\\'jjjlll.,V~WWWWWWWWWWWWWZ:U  5=\\\ kkk/ 7YK9-#)<<<`?\V~WWWWWWWWWWWvMp /___444 7m???zzz+)|QwWWWWWWWWWWTz;&8hhh;;;;=VVV555'''1A...%%%EEE`>[WWWWWWWWWW^=Z+++ QDDD+++KKKyyy!q``` 1 /V~WWWWWWWWU}'% ***!fffBBBxxx111KKKeeeQQQ>>>  sKnWWWWWWWW]=YMMMaBBBIIIGiii'''WWW999CCCrrrN3KV~WWWWWWSy2 0wwwM\\\---Y+OOO^^^]]],*~RxWWWWWWoHj  777yyy***777888{M'444ccc uuu>>> sKnWWWWWWH/D kkk^^^i???W) % `?\WWWWWSz"""...[[[S /ZZZBBB?)>>AAAHHH rKmWWzPu---!!!STTTPPP---T{WWT{#!!!! E3MRRR5"2WWWW4"1aaa 7JJJMMMU7QWWWWI0F ###)!!!@@@BBBKKK pIkWWWWdB`{{{:::...+++vvv (&}QwWWWWyPt  GGGMMMQQQ wOOO"""I/FV~WWWWSz&$gggU|||zzz|||333 tLoWWWWWV~I/EQQQHHHjjjWWW=kkk&&&3!0V~WWWWWWfCb  HHH ===$$$o$$$dddJJJ  jEeWWWWWWWU|'%EEENNNLLL jjj;'9TzWWWWWWWW]?YSSSGGG~~~3[jjj醆{  yOtWWWWWWWWW^&%6661!### s Z>>fffgggFFF  T=Qk^WWWWWWWWWfnhA-? :::XXX9PPPkkkyOB.?kobWWWWWWWWYmowXsB-@4#3bbb999KKKUUUgggWK c ;'9L4JeoiWWWWWWWWdokY@V?*=>*<;nnn !!!G\\\6667+79->)*==*=qrrrO000FFF/>)=7>***=?*=lNhnncWWW]lolY?V?*=?*=?)=OG~~~lll+[VVVqqq}@+;?)>*=>*<=*<{{{SSSq===]]]3?)>>7 ?*<?*>>E L8J/?*=?*<@+>U:RuQp\~{Uv_A\E.C?*=?*=?*=@'> 5### 7/RRR888S@Q?*=?*=?*=?*=?*=?*=?*=?*=>)=M3M)QMMMBBBC5uuu PPPvguL8JB-@?*=?+=H4FYGWgggUUUI/+++CCC»WWW I%dddGGGXXX$$$ EEE/ DDD ???YYYqqquuu^^^JJJ... '''!;QQQ 333g !iiiCCC9%fff::: +++MMMK 7ZZZ777,,,KKKlllYw?7uK!Ek{W-   80PROGRESSȐJDownloading dependenciesMS Shell DlgP msctls_progress32X2)CancelP Please wait...P -1.40 / 32.00 MBL  h  00 %@@ (B (gpodder-3.5.2/tools/win32-launcher/makefile0000644000175000017500000000260112220076757020165 0ustar thpthp00000000000000# # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # # # Makefile for building the Win32 Launcher for gPodder # Thomas Perl ; 2009-04-29 # CC ?= gcc LDFLAGS += -lkernel32 -lshell32 -lwininet -lole32 MODULES := gpodder downloader folderselector TARGETS := gpodder gpo all: $(TARGETS) gpodder: gpodder-res.o $(addsuffix _gui.o, $(MODULES)) $(CC) -o $@ -mwindows $^ $(LDFLAGS) gpo: gpo-res.o $(addsuffix _cli.o, $(MODULES)) $(CC) -o $@ $^ $(LDFLAGS) %_gui.o: %.c $(CC) -c -o $@ $(CFLAGS) -DGPODDER_GUI $^ %_cli.o: %.c $(CC) -c -o $@ $(CFLAGS) -DGPODDER_CLI $^ %-res.o: %.res windres $^ $@ clean: rm -f *.o .PHONY: clean all .DEFAULT: all gpodder-3.5.2/tools/win32-setup/0000755000175000017500000000000012220346122016007 5ustar thpthp00000000000000gpodder-3.5.2/tools/win32-setup/gpodder-setup.iss0000644000175000017500000000537312220076757021337 0ustar thpthp00000000000000; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{ABE123A1-41D1-4917-8E1E-C7E37991B673} AppName=gPodder AppVersion=3.0.4 AppPublisher=Thomas Perl AppPublisherURL=http://gpodder.org/ AppSupportURL=http://gpodder.org/ AppUpdatesURL=http://gpodder.org/ DefaultDirName={pf}\gPodder DefaultGroupName=gPodder LicenseFile=C:\Users\thp\gpodder\COPYING InfoBeforeFile=C:\Users\thp\gpodder\README OutputDir=C:\Users\thp\gpodder\tools\win32-setup OutputBaseFilename=gpodder-3.0.4-setup Compression=lzma SolidCompression=yes WizardSmallImageFile=C:\Users\thp\gpodder\tools\win32-setup\wizard-small-image.bmp WizardImageFile=C:\Users\thp\gpodder\tools\win32-setup\wizard-image.bmp [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 [Files] Source: "C:\Users\thp\gpodder\gpodder.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\thp\gpodder\gpo.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\thp\gpodder\COPYING"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\thp\gpodder\README"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\thp\gpodder\bin\*"; DestDir: "{app}\bin"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\Users\thp\gpodder\share\*"; DestDir: "{app}\share"; Excludes: "*.h,*\qml\*"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\Users\thp\gpodder\src\*"; DestDir: "{app}\src"; Excludes: "*.pyc,*.py~,*\qmlui\*"; Flags: ignoreversion recursesubdirs createallsubdirs [Icons] Name: "{group}\gPodder"; Filename: "{app}\gpodder.exe" Name: "{group}\gPodder (set download folder)"; Filename: "{app}\gpodder.exe"; Parameters: "--select-folder" Name: "{group}\gPodder (CLI)"; Filename: "{app}\gpo.exe" Name: "{group}\{cm:ProgramOnTheWeb,gPodder}"; Filename: "http://gpodder.org/" Name: "{group}\{cm:UninstallProgram,gPodder}"; Filename: "{uninstallexe}" Name: "{commondesktop}\gPodder"; Filename: "{app}\gpodder.exe"; Tasks: desktopicon Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\gPodder"; Filename: "{app}\gpodder.exe"; Tasks: quicklaunchicon [Run] Filename: "{app}\gpodder.exe"; Description: "{cm:LaunchProgram,gPodder}"; Flags: nowait postinstall skipifsilent gpodder-3.5.2/tools/win32-setup/wizard-image.bmp0000644000175000017500000062232612220076757021120 0ustar thpthp00000000000000BM$6(: $  |znxpcnhYf`P]YIWRAQN=LG4EB.@>*=?)=>)*=@-?D1BI7HL:KRAPVETZJX^O\bS`hZgocnymww¿¿¿{l`kVFTH5FB.@?*=?*=?*=@*>@*>@*>@*>@*>?*=>)<>)<=);<(;<(:;'9;'9:'8:&89&89&79%78%78%78%78%78%78%78%78%78%79%79%78%79&79&7:&8:'8:'9;'9;(:<(:<(;=);=)<>)@*>@*>@*>@*>@*>?*=?*=?*=?*=A-?C/AF3ER?O]LZeWcsiry~t}hZeQ?N?*)<>)<=);=(;<(:;'9:&8:&89%78%67$6;'9?)=B+@F-DI/FL1IP4MT8QV8RX:TZY]?Z`A]aB^aB^aB^aB^aB^aB^aB^aB^aB^`A]`A]aA]_@\]>Y[?)<<':9%68$68%79&7:&8:&8;'9;'9<(:<(;=(;=(;=)<>)<>)<>)N)=<(;;(9;(9:&8;'9=';?)=A+?J0FS7P]>ZfDboLjvQr~Wx\~_bcgijllmnnopppppppppppppoonmlkjjheda_][}X{zTvtOokIgdCa^?[Y;US7PL2IE.BA+?@*>>(<=';<':;'9:'89&7;(::'8<':=(;>)=?)=?*=B/@K9IZIXtir^N\?)=?)=?)=>)<<(:9&78$6A*>K1HU9RaB^nLk~Wy`hlorrrrrrrqqqqqppppppppppppppppppppppppppqqqqqqrrrrrrrqonljfa[~|VxtQplJgdC`[=WT7QK1HE,B?)=8%68%7;'9=(;>)=?)=?)=?)=?*O?*=>)=<)::'8:&8?))Nocm¿P=O?)=?*><(:9%7D,AX:TpMmbmrsrqpppppomkjihfda`_^]][ZZYZZZZZZZZZZZZZZZZZ[[[\\]^_``bccdeghjjkllmnoppppppppqrrrrpkbyStfFcU9QH.E;'98%6=(;@*>?)=?))<<':9%7L2IlIg`osqpopppojgda_^\[YXYYZZ[[[[\\\\\\\\\\\\\\\\\\\\\\\[[[[[[[[[ZZZZZZZ[\\]_`bcddgijmoppppoopqsrodxTscC_I0G9%7:&8<(:>))=?*=:&8J0FuPplsrpppnkhc]\[[ZYZZ[[\\\\\\\[\[\\[\\\[\\[\\\[\\[\\\[\\[\\\[\\[\\\[\\\[[[[[ZZZZZZ[[[\\^bdhkmnpppprsrjXz^?[E-B:&8=(;@*>?)=ZIY?*<>)<:&8Y:Vgrpopoid_ZZ[[[[[[\\\[[\[[\[[[\[[\[[[\[[\[[[\[[\[[[\[[\[[[\[[\[[[\[[\[[[\[[\[[[\[[[[[[[[[ZZZ]`dfjopooprqdjHgF-D8%7=(;?)=?)=bQ`>)<:'8Y;Vlrnpog_\Z[\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\\\\\\[\[\\\\\[[ZZ\^binopnprelIh@)>:&8>))*<>*>*X;(9>)bqq_T}W~VWWV~V~V~V~V~V~U~U}T}U}V~XZ[\]^^_____^]\ZWU}T}U~V~V~V~V~WWWV~VWV~WWWV~VWV~WWWV~VWWV~V~V~V~V~V~V~V~V~V~V~V~V~V~WWXYZZ[\\\\\\\[[\[[\[\\\[[\[\\[\YhpsyUu<':>)(=(;G2Dxjw>)<<':sNnrpgU}V~X[\`dhlooopppooooppqqrrssrrrrqppooold]V~U}WWV~V~V~V~WV~V~VV~V~V~WV~V~VV~V~V~WV~V~VV~V~V~WV~V~VV~WWWWWWWWV~V~V~V~WXY[[\\\[[\\\[\\[\\\\Z^molH/F<(:A,?>)<:(8dC`romghknpqppppqqrrrrqomjfa^[||XxyVuyUuzWv|Yx}Zy_~fkqsrrqqpi_U~U~V~WV~WWWW~WWW~WWWW~WWW~WWWW~WWW~WWV~WV~V~U~U~U}U}U}U}U}U}U}U}U}U}U}U}U}V~WXZ[\\\\[\\\[\\\[[^momO4M<':?*=Ŀ?*==);M2Jiqnpooooqrrpmga\~|UwoKkdC`Z?)=?)<>(;>)<>)<>))A,?G1ET)<;&8mJissrspnj_|WxoLkdC`X:TL1ID,B<':8%69%7:&8;'9<':<(:=(;=(;=(;=);=);>)<>)<>)<>)<>)<>)<=);=(;=(;<(:;'99%89&7E0C_E\}]ysqpn`T}WWVV~V~WW~V~V~VV~V~WW~V~V~VV~V~WW~WVV~U}Zdlpppppppppppppqnkgc_[V~T}V~XZ\\\\[\[[[]lonS7P;'9?*=?*=>)YtNovPqmJibB^T8QI0GD,A?)=;'98%7:'8<(;>)@*>?*=?*=?*=B-@E1BG3EM:K[IYgVetdrwyxv|mzjYh]L\N=(;9%8=);W@Tftop`U}V~WWV~WWV~WWWV~WWV~WWWV~WWWU}WenpopsssqqqqrssssqppppomlhaZWV~WZ\\\[\[]lonT8P;'9?*=o`n?*==);:&8:&8:&8:&8:&8;'9;'9<(:=);>)<>))<=(;9%8>*(;C+@J1GQ6M]>YkJgY|gmrrrppppmib\[[XZmplL2I<(:@+>{vrcr?*=;&9H1Fkpp[V~V~V~VV~V~V~WV~V~VV~V~V~WWWV~XlppoqMlB+?8$6<(:<(:>)<>))*)<>)<=);<(:;(:;(9:&8:&8;'9?)=M3J`@\tPp`krrpopookf\_ophC,@=(;D/B]L\@+>7#5vUrrpdT}WW~WWW~WWWW~WWW~WWV~V~U}dpopgFc9%7=))*<>)<>)<>)<>)<<(:9&87$6B*?Q5MdD`|Vwhqrqppqpmnq_?)==);K8J?*=:&9X))<<(:<*::'8<':E-C`?\zRubmqqoonsmLi:&8>))<>)<<(;:&89%7H.EZ:UqMm_lpteI0F>+=);9&7<':C,AL3IY*)<<(:;'9:&9:&8<':?*=@+>?*=;'9Y))<^L\www|@*>8%6nLjrpfT}WV~VV~V~V~WV~V~VV~V~V~V~T}cqr~Wy;&9>))[|||zzz---```ppp  }RxWWV~WW[9%7;;;)))CCC???!!!777`?\[V~V~WY}Rx ^^^~~~555tttJ0G^V~V~V~[lFh222LLL%%% 4"2[WV~V~[H/ElllCCC+++ www T{XW~V}\&$***@@@VVV\\\111---}}} zPtYV~V~Y qqq>>>sss111tLoZWXsKmEEE FFFnHi[V~[\[[ZtLo  (((\\\IIIlGh[ZvMq """;;;[[[UUU666rJmZZxOs bbbIII(((  yOtYY}Qw%%%MMMTzXXU}888888KKK0 .ZWXZ'%JJJKKK???VVVrrrI0F^V~W_5"2```:::!!!333_>[[VV~]F.Cvvvxxx222BBB SzWV~V~[]=Y<<)<<(:xXusq_U}V~WW~WWV~VjosT)8$6lOitohU}V~WU}Wjot]{:&8@*>K7I000%%%?*==(;B-@kpocU}S|YjponI2G;'9?*=gggl\j>)<:'8aF^tpoigmpps`C]9%7>)*<>)<<':rQnqsrticD_8%7>)53.,-+.,8"6R?QvvvYYY^^^v```:::%%%gggfff'''AAA(((TTTddd&&&###000***www$$$"""gggDDD AAAyyyxxxeeeXXXLLLHHHOOOVVVZZZsssgpodder-3.5.2/tools/win32-setup/wizard-small-image.bmp0000644000175000017500000003101612220076757022214 0ustar thpthp00000000000000BM26(7: 1  ¿y|qyvhrn^lhTdaL^`J]aM_cN`ePafSchVejYgl[in]jp`mrcnvis}rz{¿x}o_ldM_\@XaE^eIbiLfoOksRpyUt}Yx[}_`^]]~\}[{Z{~Yz}Xy{WwzVvvTrpPmkMgeIbaE^^BZ_E[hTdqcnwot}v{sfraF^lLhzWv^ehffdba`_^]]^^__``aaabdeghfa]zXvrRnkMhcF_jZgzpwhSevUrdge`\XXXYYZZZ[[[[[ZZZZZZZYYXWWZ\_begc]|qPmbL`}p|yWuh\XW~Y[\\\\\\\\\\\\\\\\\\\\\\\\\\[ZYXY\agbhJdwhvxgub[T}V~WV~WWXXYYZZZ[[[[[[[[[\\\\\\\\[[\\\\[ZZ_ilMhwzkx_\U}V~V~V~V~V~U~U~U~U~U~U~V~WWWXWXXXXYYZZZ[[[\\\\\\\\[Z]fdJaykw]}_U~VWWX[^____^ZWWV~V~V~V~V~V~V~V~V~V~WWWWWWXYZ[\\\\\ZbsRorRog`bcec_}XyxVsvTqtSprRntTp~[z``[VV~WWWWWWWV~U~U~XZZZZYXWY[\\[`}Zxr~hUfqQmvUrnNkpUmmVkfRdo\mx{p^nfOd^}_V~V~WV~V~WV~WU~Wcca`aaabd`[WYZ^{Yw~hWf}\z_U}W~V~W~WWV~XeyXulSivduxguwfvuasmRjoOkvUr\{bfc]_yWugKdaWV~V~WWWU}fqSnwivýrgLdlNiyWu_fgJdoVm`XV~V~V~WV~ZciRfr[o[AXqkkknnnpQmcV~V~V~W~V~T|b[{{kkkUUUSSS~[yaT|WV~WV~U~dK5H'''$$$---kkkooo&(&2!0\YV~WV~Y\<%9lmmnnndddI,E\XV~X]E*B ???)))dddIII }Px[W\nDh vvv...SSS333444GGG|||GGGdddlll!!!!!!Q.M\X[0-;=;$$$LLL000www888777aeb#!V[oEj EEEttt666000AAAiii555zLu]C'?...///---rrrYYY:::^^^IIIf>a_-+adb)))LLLwwwmmmS1OY 444ppp ooo ;;;FFF<;_YYY```:89M-Id>_! fff555-*-S1Ne?_{{{kkk""""""  X5Tc>^NNNlll{{{222oEjkDf 444111xxxkkkTTTx{xVT} BBB!!!9:963Z\,)_b`NNN (((xxxYYYFFFddd f?b[[G*D$$$&&&rrrBBB!!!!=$:\XYzMu mpm|||ggggggccc!#!,*W~ZV~V_\@Y***WWW RRR'''999?6>|Xx`U}WU~dtYqjjj---???PPPmmmcccvvvGGGwWtcU}U}ZakXi{{{AAA^^^iSgbZWfdHa444OOOfFbccjJfvvvvBBBhQfkTgxooowww***lll"""``` ! IJINONOOO<<<%%%zzzccc555 ===lllgpodder-3.5.2/tools/generate-ubuntu-source.sh0000644000175000017500000000175212220076757020676 0ustar thpthp00000000000000#!/bin/sh # Generate Ubuntu derivations of a normal Debian package source # 2009-09-23 Thomas Perl SOURCEFILE=$1 VERSION=`echo $SOURCEFILE | sed -e 's/[^_]*_\(.*\)-[^-]*\.dsc/\1/g'` FOLDER=`echo $SOURCEFILE | sed -e 's/\([^_]*\)_.*/\1/g'`-${VERSION} # See https://wiki.ubuntu.com/DevelopmentCodeNames UBUNTU_RELEASES="maverick natty oneiric precise quantal raring" echo "SOURCEFILE = $SOURCEFILE" echo "VERSION = $VERSION" echo "FOLDER = $FOLDER" for DIST in $UBUNTU_RELEASES; do dpkg-source -x $SOURCEFILE cd $FOLDER VERSION=`dpkg-parsechangelog | awk '/^Version: / {print $2}'` NEW_VERSION=${VERSION}~${DIST}0 dch --distribution ${DIST} \ --force-bad-version --preserve \ --newversion ${NEW_VERSION} "Automatic build for ${DIST}" dpkg-buildpackage -S -sa -us -uc cd .. rm -rf $FOLDER done debsign *.changes echo echo " If signing (as oppposed to singing) went well, do this now:" echo echo " dput ppa:thp/gpodder *.changes" echo gpodder-3.5.2/tools/localdepends.py0000644000175000017500000000377712220076757016752 0ustar thpthp00000000000000#!/usr/bin/python # # gPodder dependency installer for running the CLI from the source tree # # Run "python localdepends.py" and it will download and inject dependencies, # so you only need a standard Python installation for the command-line utility # # Thomas Perl ; 2012-02-11 # import urllib2 import re import sys import StringIO import tarfile import os import shutil import tempfile sys.stdout = sys.stderr src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'src')) tmp_dir = tempfile.mkdtemp() MODULES = [ # Module name, Regex-file chooser (1st group = location in "src/") ('feedparser', r'feedparser-[0-9.]+/feedparser/(feedparser.py)'), ('mygpoclient', r'mygpoclient-[0-9.]+/(mygpoclient/[^/]*\.py)') ] def get_tarball_url(modulename): url = 'http://pypi.python.org/pypi/' + modulename html = urllib2.urlopen(url).read() match = re.search(r'(http[s]?://[^>]*%s-([0-9.]*)\.tar\.gz)' % modulename, html) return match.group(0) if match is not None else None for module, required_files in MODULES: print 'Fetching', module, '...', tarball_url = get_tarball_url(module) if tarball_url is None: print 'Cannot determine download URL for', module, '- aborting!' break data = urllib2.urlopen(tarball_url).read() print '%d KiB' % (len(data)/1024) tar = tarfile.open(fileobj=StringIO.StringIO(data)) for name in tar.getnames(): match = re.match(required_files, name) if match is not None: target_name = match.group(1) target_file = os.path.join(src_dir, target_name) if os.path.exists(target_file): print 'Skipping:', target_file continue target_dir = os.path.dirname(target_file) if not os.path.isdir(target_dir): os.mkdir(target_dir) print 'Extracting:', target_name tar.extract(name, tmp_dir) shutil.move(os.path.join(tmp_dir, name), target_file) shutil.rmtree(tmp_dir) gpodder-3.5.2/tools/make-help.txt0000644000175000017500000000225012220076757016330 0ustar thpthp00000000000000 gPodder' makefile commands ----------------------- ---- --- -- - - For developers make unittest Run doctests and unittests make manpage Update generated manual pages from source make messages Update translation files in po/ from source make headlink Print commit URL for the current Git head make clean Remove generated and compiled files make distclean "make clean" + remove dist/ For maintainers make releasetest Run some basic release sanity checks make release Create the source tarball in dist/ For users/packagers make install Install gPodder into $DESTDIR/$PREFIX ----------------------- ---- --- -- - - make install supports the following environment variables: PREFIX The installation prefix (default: /usr) DESTDIR The installation destination (default: /) GPODDER_INSTALL_UIS A space-separated list of UIs to install LINGUAS A space-separated list of translations See the README file for more information on how to install gPodder. gpodder-3.5.2/tools/progressbar_icon_tester.py0000644000175000017500000000132012220076757021222 0ustar thpthp00000000000000#!/usr/bin/python # Progressbar icon tester # Thomas Perl ; 2012-02-05 # # based on: Simple script to test gPodder's "pill" pixbuf implementation # Thomas Perl ; 2009-09-13 import sys sys.path.insert(0, 'src') import gtk from gpodder.gtkui.draw import draw_cake_pixbuf def gen(percentage): pixbuf = draw_cake_pixbuf(percentage) return gtk.image_new_from_pixbuf(pixbuf) w = gtk.Window() w.connect('destroy', gtk.main_quit) v = gtk.VBox() w.add(v) for y in xrange(1): h = gtk.HBox() h.set_homogeneous(True) v.add(h) PARTS = 20 for x in xrange(PARTS + 1): h.add(gen(float(x)/float(PARTS))) w.set_default_size(400, 100) w.show_all() gtk.main() gpodder-3.5.2/tools/test-auth-server.py0000644000175000017500000001001512220076757017516 0ustar thpthp00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # Simple HTTP web server for testing HTTP Authentication (see bug 1539) # from our crappy-but-does-the-job department # Thomas Perl ; 2012-01-20 import BaseHTTPServer import sys import re import hashlib import datetime USERNAME = 'user@example.com' # Username used for HTTP Authentication PASSWORD = 'secret' # Password used for HTTP Authentication HOST, PORT = 'localhost', 8000 # Hostname and port for the HTTP server # When the script contents change, the feed's episodes each get a new GUID GUID = hashlib.sha1(open(__file__).read()).hexdigest() URL = 'http://%(HOST)s:%(PORT)s' % locals() FEEDNAME = sys.argv[0] # The title of the RSS feed FEEDFILE = 'feed.rss' # The "filename" of the feed on the server EPISODES = 'episode' # Base name for the episode files EPISODES_EXT = '.mp3' # Extension for the episode files EPISODES_MIME = 'audio/mpeg' # Mime type for the episode files EP_COUNT = 7 # Number of episodes in the feed SIZE = 500000 # Size (in bytes) of the episode downloads) def mkpubdates(items): """Generate fake pubDates (one each day, recently)""" current = datetime.datetime.now() - datetime.timedelta(days=items+3) for i in range(items): yield current.ctime() current += datetime.timedelta(days=1) def mkrss(items=EP_COUNT): """Generate a dumm RSS feed with a given number of items""" ITEMS = '\n'.join(""" Episode %(INDEX)s tag:test.gpodder.org,2012:%(GUID)s,%(URL)s,%(INDEX)s %(PUBDATE)s """ % dict(locals().items()+globals().items()) for INDEX, PUBDATE in enumerate(mkpubdates(items))) return """ %(FEEDNAME)s%(URL)s %(ITEMS)s """ % dict(locals().items()+globals().items()) def mkdata(size=SIZE): """Generate dummy data of a given size (in bytes)""" return ''.join(chr(32+(i%(127-32))) for i in range(size)) class AuthRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): FEEDFILE_PATH = '/%s' % FEEDFILE EPISODES_PATH = '/%s' % EPISODES def do_GET(self): authorized = False is_feed = False is_episode = False auth_header = self.headers.get('authorization', '') m = re.match(r'^Basic (.*)$', auth_header) if m is not None: auth_data = m.group(1).decode('base64').split(':', 1) if len(auth_data) == 2: username, password = auth_data print 'Got username:', username print 'Got password:', password if (username, password) == (USERNAME, PASSWORD): print 'Valid credentials provided.' authorized = True if self.path == self.FEEDFILE_PATH: print 'Feed request.' is_feed = True elif self.path.startswith(self.EPISODES_PATH): print 'Episode request.' is_episode = True if not authorized: print 'Not authorized - sending WWW-Authenticate header.' self.send_response(401) self.send_header('WWW-Authenticate', 'Basic realm="%s"' % sys.argv[0]) self.end_headers() self.wfile.close() return self.send_response(200) self.send_header('Content-type', 'application/xml' if is_feed else 'audio/mpeg') self.end_headers() self.wfile.write(mkrss() if is_feed else mkdata()) self.wfile.close() if __name__ == '__main__': httpd = BaseHTTPServer.HTTPServer((HOST, PORT), AuthRequestHandler) print """ Feed URL: %(URL)s/%(FEEDFILE)s Username: %(USERNAME)s Password: %(PASSWORD)s """ % locals() while True: httpd.handle_request() gpodder-3.5.2/tools/upgrade-win32-binary-package.py0000644000175000017500000001215612220076757021546 0ustar thpthp00000000000000#!/usr/bin/python # Upgrade script for the gPodder Win32 release # Injects new data into an old win32 release to build a new release # Thomas Perl ; 2011-04-08 # Required files: # - An old win32 release # - The source tarball of the new release # - The (binary) Debian package of the new release # - The source tarball of the most recent mygpoclient # - The source tarball of the most recent feedparser import os import subprocess import sys import re import glob if len(sys.argv) != 6: print """ Usage: %s With: , e.g. gpodder-2.12-win32.zip , e.g. gpodder-2.14.tar.gz , e.g. gpodder_2.14-1_all.deb , e.g. mygpoclient-1.5.tar.gz , e.g. feedparser-5.0.1.tar.gz """ % sys.argv[0] sys.exit(1) progname, old_zip, source_tgz, deb, mygpoclient_tgz, feedparser_tgz = sys.argv print '-'*80 print 'gPodder Win32 Release Builder' print '-'*80 m = re.match(r'gpodder-(\d+).(\d+)-win32.zip', old_zip) if not m: print 'Unknown filename scheme for', old_zip sys.exit(1) old_version = '.'.join(m.groups()) print 'Old version:', old_version m = re.match(r'gpodder-(\d+).(\d+).tar.gz', source_tgz) if not m: print 'Unknown filename scheme for', source_tgz sys.exit(1) new_version = '.'.join(m.groups()) print 'New version:', new_version m = re.match(r'gpodder_(\d+).(\d+)-(.*)_all.deb$', deb) if not m: print 'Unknown filename scheme for', deb sys.exit(1) deb_version = '.'.join(m.groups()[:2]) + '-' + m.group(3) print 'Debian version:', deb_version m = re.match(r'mygpoclient-(\d+).(\d+).tar.gz', mygpoclient_tgz) if not m: print 'Unknown filename scheme for', mygpoclient_tgz sys.exit(1) mygpoclient_version = '.'.join(m.groups()) print 'mygpoclient version:', mygpoclient_version m = re.match(r'feedparser-(\d+).(\d+).(\d+).tar.gz', feedparser_tgz) if not m: print 'Unknown filename scheme for', feedparser_tgz sys.exit(1) feedparser_version = '.'.join(m.groups()) print 'feedparser version:', feedparser_version print '-'*80 print 'Press any key to continue, Ctrl+C to abort.', raw_input() if not deb_version.startswith(new_version): print 'New version and Debian version mismatch:' print new_version, '<->', deb_version sys.exit(1) def sh(*args, **kwargs): print '->', ' '.join(args[0]) try: ret = subprocess.call(*args, **kwargs) except Exception, e: print e ret = -1 if ret != 0: print 'EXIT STATUS:', ret sys.exit(1) old_dir, _ = os.path.splitext(old_zip) new_dir = old_dir.replace(old_version, new_version) target_file = new_dir + '.zip' source_dir = source_tgz[:-len('.tar.gz')] deb_dir, _ = os.path.splitext(deb) mygpoclient_dir = mygpoclient_tgz[:-len('.tar.gz')] feedparser_dir = feedparser_tgz[:-len('.tar.gz')] print 'Cleaning up...' sh(['rm', '-rf', old_dir, new_dir, source_dir, deb_dir, mygpoclient_dir, feedparser_dir]) print 'Extracting...' sh(['unzip', '-q', old_zip]) sh(['tar', 'xzf', source_tgz]) sh(['dpkg', '-X', deb, deb_dir], stdout=subprocess.PIPE) sh(['tar', 'xzf', mygpoclient_tgz]) sh(['tar', 'xzf', feedparser_tgz]) print 'Renaming win32 folder...' sh(['mv', old_dir, new_dir]) copy_files_direct = [ 'ChangeLog', 'COPYING', 'README', 'data/credits.txt', 'data/gpodder.png', 'data/images/*', 'data/ui/*.ui', 'data/ui/desktop/*.ui', ] print 'Replacing data files...' for pattern in copy_files_direct: from_files = glob.glob(os.path.join(source_dir, pattern)) to_files = glob.glob(os.path.join(new_dir, pattern)) to_folder = os.path.dirname(os.path.join(new_dir, pattern)) if to_files: sh(['rm']+to_files) if not os.path.exists(to_folder): sh(['mkdir', to_folder]) if from_files: sh(['cp']+from_files+[to_folder]) print 'Copying translations...' sh(['cp', '-r', os.path.join(deb_dir, 'usr', 'share', 'locale'), os.path.join(new_dir, 'share')]) print 'Copying icons...' sh(['cp', '-r', os.path.join(deb_dir, 'usr', 'share', 'icons'), os.path.join(new_dir, 'icons')]) print 'Replacing Python package gpodder...' sh(['rm', '-rf', os.path.join(new_dir, 'lib', 'site-packages', 'gpodder')]) sh(['cp', '-r', os.path.join(source_dir, 'src', 'gpodder'), os.path.join(new_dir, 'lib', 'site-packages')]) print 'Replacing Python package mygpoclient...' sh(['rm', '-rf', os.path.join(new_dir, 'lib', 'site-packages', 'mygpoclient')]) sh(['cp', '-r', os.path.join(mygpoclient_dir, 'mygpoclient'), os.path.join(new_dir, 'lib', 'site-packages')]) print 'Replacing Python module feedparser...' sh(['rm', '-f', os.path.join(new_dir, 'lib', 'site-packages', 'feedparser.py')]) sh(['cp', os.path.join(feedparser_dir, 'feedparser', 'feedparser.py'), os.path.join(new_dir, 'lib', 'site-packages')]) print 'Building release...' sh(['rm', '-f', target_file]) sh(['zip', '-qr', target_file, new_dir]) print 'Cleaning up...' sh(['rm', '-rf', old_dir, new_dir, source_dir, deb_dir, mygpoclient_dir, feedparser_dir]) print '-'*80 + '\n' print 'Successfully built gpodder', new_version, 'win32 release:' print ' ', target_file, '\n' gpodder-3.5.2/COPYING0000644000175000017500000010451311717652533013626 0ustar thpthp00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. 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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gpodder-3.5.2/ChangeLog0000644000175000017500000002045512220346116014332 0ustar thpthp00000000000000commit 0830e76c55617610422a64c355ec1b14653978ac Author: Thomas Perl Date: Tue Sep 24 19:28:49 2013 +0200 gPodder 3.5.2 "The Prime Mover" released Updated version info and manpages commit 1fa8dd1c278bb370108938613cd9742fe8b30e89 Author: Thomas Perl Date: Tue Sep 24 19:28:16 2013 +0200 Updated translations from source commit 88e65395b58b40904522ca19c5fe11188bd78447 Merge: d853073 4b1d94c Author: Thomas Perl Date: Sat Sep 21 07:34:01 2013 -0700 Merge pull request #103 from stefankoegl/unauthorized disable gpodder.net on invalid password commit 4b1d94cc9301853cd2cc08800cc9ae98fd626728 Author: Stefan Kögl Date: Sat Sep 21 15:46:35 2013 +0200 disable gpodder.net on invalid password commit d8530734c0bbe095aa01e2692a9c699af4eb6a29 Merge: 22efa71 0274a92 Author: Thomas Perl Date: Mon Aug 5 22:48:58 2013 -0700 Merge pull request #102 from pluton8/bug1834_unicodeerror_finisheddownloads Gtk UI: Fix UnicodeDecodeError after downloads are finished (bug 1834) commit 0274a92da44f8dc1957d2805f15bc336f7c6371a Author: Eugene Nikolsky Date: Sat Aug 3 12:56:53 2013 +0300 Gtk UI: Fix UnicodeDecodeError after downloads are finished (bug 1834) When all downloads/syncs are finished, gPodder displays a summary of downloaded episodes, having cut the titles if they are too long. However, Russian descriptions are regular, non-unicode python strings, and gPodder may cut only a part of a multi-byte UTF-8 sequence. It causes an exception like this: UnicodeDecodeError: 'utf8' codec can't decode byte 0xbe in position 51: invalid start byte This patch fixes that by converting the title to a unicode string if it's not unicode. This bug is similar to bug 1825, commit e1ce9b0551d6380514d255ec03d3609c574860c8. commit 22efa71207e31cdcd54baa5dafd76d5bd28a2c7a Merge: 1c3c6f1 7dc92bf Author: Thomas Perl Date: Mon Jun 17 22:58:34 2013 -0700 Merge pull request #101 from pluton8/bug1832_device_sync_progress Gtk UI: Fix device sync progress not updating (bug 1832) commit 7dc92bfde9e5f234c14fc30bb40c86660b3d7142 Author: Eugene Nikolsky Date: Fri Jun 14 23:45:55 2013 +0300 Gtk UI: Fix device sync progress not updating (bug 1832) When the verbose mode is on, and the database is big, it can take several seconds for gPodder to log all excluded from sync episodes. At that time, the update downloads list timer stops, because there are no sync tasks yet. This patch ensures the download list is updated after all the sync tasks are added to the download queue. commit 1c3c6f1317809e1a3ddc062c67069c51a9635aa5 Merge: 5d6ffa1 74cb136 Author: Thomas Perl Date: Fri May 31 00:01:34 2013 -0700 Merge pull request #95 from rigo/Bug1813 QMLUI Added option to update podcasts inside episodes page - Bug 1813 commit 74cb1365ac1054c6117775361e88952da1ef5b43 Author: Rigoberto Calleja Date: Thu May 30 22:23:33 2013 -0500 Podcast title and download status implementation as requested commit 5d6ffa1aee82f2a7cc4eb4eb63651973c22b67e4 Merge: 429ab27 e1ce9b0 Author: Thomas Perl Date: Mon May 13 15:05:58 2013 -0700 Merge pull request #97 from pluton8/bug1825_osx_crash gpodder: Fix crash on OS X when displaying episode tooltip (bug 1825) commit e1ce9b0551d6380514d255ec03d3609c574860c8 Author: Eugene Nikolsky Date: Sun May 12 23:40:50 2013 +0300 Gtk UI: Fix crash on OS X when truncating tooltip (bug 1825) When displaying a long episode description in a tooltip in the "New episodes available" dialog, gPodder cuts it at a certain number of characters. However, Russian descriptions are regular, non-unicode python strings, and gPodder may cut only a part of a multi-byte UTF-8 sequence. Displaying such a string crashes gPodder on OS X. This patch fixes that by converting the description to a unicode string if it's not unicode. commit 429ab2772bf9021c3715ebbd04ad0b1a761acce2 Author: Maurizio Ballo Date: Thu Apr 25 14:52:22 2013 +0200 Updated Italian translation commit 4ae67aad54c9b8a4105d863596ff63f4577c0a5d Author: Rigoberto Calleja Date: Sun Apr 14 15:07:23 2013 -0500 QML UI: Show "Added to playlist" message (pull request 94) commit e20122a41a7a01814fdb500b865fe560d2492e74 Author: Rigoberto Calleja Date: Tue Apr 23 20:38:08 2013 -0500 Updated patch commit dd5ac3486221e35d12c274fc78942449bfda0090 Merge: 602a722 26a58c0 Author: Thomas Perl Date: Tue Apr 23 09:42:21 2013 -0700 Merge pull request #88 from jnwickremasinghe/bug_1789 Fix to only include unplayed episodes in playlist (bug 1789) commit 602a72269163827c0bde544852296a27a8e3eb0c Author: Thomas Perl Date: Tue Apr 23 18:39:45 2013 +0200 makefile: Add Harmattan and Sailfish to QMLFILES Based on a patch by Rigoberto Calleja, see https://github.com/gpodder/gpodder/pull/91 commit 509246e5ae8dfe0c1a742b5c14202b3dff77e0af Merge: 674dc36 b7200bc Author: Thomas Perl Date: Tue Apr 23 09:36:38 2013 -0700 Merge pull request #92 from rigo/patch-3 Updated translation template from source commit 674dc360e1e31a66c6e6a43f2d1081feaf980166 Merge: f1f218d 81d59a2 Author: Thomas Perl Date: Tue Apr 23 09:36:14 2013 -0700 Merge pull request #93 from rigo/patch-5 Updated Spanish (Mexico) translation file commit f1f218ddf2fc6ef78611fd2a3f30b3e46870ecae Author: Bernd Schlapsi Date: Sat Apr 20 14:27:41 2013 +0200 Add option to auto embed coverart image (bug 1742) Refactored the code to be able to add filetype specific logic. Until now we used only the mutagen abstraction to implement one code for all file types, but this don't work for special needs (e.g: coverart manipulation) commit 63d6df5ed07dfc13c4fbd4fa3e363f9ed3b31d6a Author: Bernd Schlapsi Date: Sat Apr 20 14:27:08 2013 +0200 Bugfixing for two of the extensions Fixing bugs I found while running the extension tests from the seperate extension repository https://github.com/gpodder/gpodder-hook-scripts/tree/master-core commit 3a0f32c136cf37d95abf71229e4df50780f84290 Author: Rigoberto Calleja Date: Wed Apr 17 19:50:29 2013 -0500 QMLUI Added option to update podcasts inside episodes page - Bug 1813 commit 81d59a2f81ad428b751cf729d2e657cea1443432 Author: Rigoberto Calleja Date: Sun Apr 14 13:58:15 2013 -0500 Updated Spanish (Mexico) translation file commit b7200bcbc0b3a57b9c5f515e4af85a7e1a07a522 Author: Rigoberto Calleja Date: Sun Apr 14 13:25:03 2013 -0500 Updated translation template from source commit a528123e6413ecd43d78253511ede29ec3e106a4 Author: Thomas Perl Date: Sat Apr 13 12:34:11 2013 +0200 Gtk UI: Episode selector: Open context menu with keyboard Allow opening the context menu in the episode selector dialog using the keyboard in addition to right-clicking with the mouse. commit 036b4193e243818aadd1b5d4d2c93922705a02cd Author: Thomas Perl Date: Sat Apr 13 12:27:44 2013 +0200 Gtk UI: Better positioning of menu when opened using keyboard commit bbfcd58ba60972e7e1b91078295b0c7d5fa943b9 Author: Bernd Schlapsi Date: Sun Mar 24 21:13:27 2013 +0100 Add option to flattr an extensions and to show documentation If an extension author adds an flattr url to the extensions metadata gPodder shows the "Flattr this" menu entry in the popup menu for an extension in the preference dialog. Alternative the extension author can add an url to the extensions metadata to link to the authors donation page (Support the author). Also the extension author can add an url to the extensions metadata to link to the extensions user documentation. commit 26a58c00fbdd3535874d42ffa84ae7a762aacc8a Author: Joseph Wickremasinghe Date: Wed Apr 10 08:17:28 2013 -0700 Fix to only include unplayed episodes in playlist if 'only sync unplayed' is checked gpodder-3.5.2/MANIFEST.in0000644000175000017500000000021212215615137014311 0ustar thpthp00000000000000include README COPYING MANIFEST.in ChangeLog makefile setup.py recursive-include share * recursive-include po * recursive-include tools * gpodder-3.5.2/README0000644000175000017500000002466112220076757013456 0ustar thpthp00000000000000 ___ _ _ ____ __ _| _ \___ __| |__| |___ _ _ |__ / / _` | _/ _ \/ _` / _` / -_) '_| |_ \ \__, |_| \___/\__,_\__,_\___|_| |___/ |___/ Media aggregator and podcast client ............................................................................ Copyright 2005-2013 Thomas Perl and the gPodder Team [ LICENSE ] gPodder is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. gPodder is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . [ DEPENDENCIES ] - Python 2.6 or newer http://python.org/ - "sqlite3" Python module (usually included with Python) - Feedparser 5.1.2 or newer http://code.google.com/p/feedparser/ - mygpoclient 1.7 or newer http://thp.io/2010/mygpoclient/ - Python D-Bus bindings gPodder might still work with Python 2.5, but you may need to install the json module ("simplejson") manually. We reserve the right to drop support for Python 2.5 in future point releases. As an alternative to python-dbus on Mac OS X and Windows, you can use the dummy (no-op) D-Bus module provided in "tools/fake-dbus-module/". For quick testing, you can use the script tools/localdepends.py to install local copies of feedparser and mygpoclient into "src/" from PyPI. With this, you get a self-contained gPodder CLI/WebUI codebase. [ GTK UI - ADDITIONAL DEPENDENCIES ] - PyGTK 2.16 or newer http://pygtk.org/ [ QML UI - ADDITIONAL DEPENDENCIES ] - Qt 4.7.1 or newer http://qt.nokia.com/ - PySide 1.0.8 or newer http://www.pyside.org/ - Qt Mobility 1.2 or newer http://qt.gitorious.org/qt-mobility - Qt Quick Components http://qt.gitorious.org/qt-components - Sailfish Silica Components https://sailfishos.org/sailfish-silica/ The QML UI depends on the QtMultimediaKit QML bindings for playing back audio (libdeclarative-multimedia in Debian) and on the WebKit QML bindings for Flattr integration (libqtwebkit-qmlwebkitplugin in Debian). The QML UI now also depends on Qt Quick Components. On MeeGo 1.2 Harmattan, these components are pre-installed. You can install them on your Desktop by checking out the code from the qt-components Git repository and running the "./configure" script with the "-meego" parameter (+ the usual make install). You might also need to copy the theme from /usr/share/themes/blanco/ on a MeeGo 1.2 Harmattan device to your development machine in order for all UI elements to be displayed correctly. Alternatively, you can use the free "darko" theme from: https://github.com/jpavelek/meego-handset-theme-darko For running gPodder on Sailfish OS using Sailfish Silica Components, you need to have Sailfish Silica installed. Right now, gPodder still depends on qt-components even on Sailfish, but this is going to change soon once a more mature version of Sailfish Silica is out. [ OPTIONAL DEPENDENCIES ] - Bluetooth file sending: gnome-obex-send or bluetooth-sendto - HTML shownotes: python-webkit - Flattr integration: python-webkit - Size detection on Windows: PyWin32 - Native OS X support: ige-mac-integration - MP3 Player Sync Support: python-eyed3 (< 0.7) [ BUILD DEPENDENCIES ] - help2man - intltool [ TEST DEPENDENCIES ] - python-minimock - python-coverage [ TESTING ] To run tests, use... make unittest To set a specific python binary set PYTHON: PYTHON=python2 make unittest Tests in gPodder are written in two different ways: - doctests (see http://docs.python.org/2/library/doctest.html) - unittests (see http://docs.python.org/2/library/unittest.html) If you want to add doctests, simply write the doctest and make sure that the module appears in "doctest_modules" in src/gpodder/unittests.py. For example, the doctests in src/gpodder/util.py are added as 'util' (the "gpodder" prefix must not be specified there). If you want to add unit tests for a specific module (ex: gpodder.model), you should add the tests as gpodder.test.model, or in other words: The file src/gpodder/model.py is tested by src/gpodder/test/model.py After you've added the test, make sure that the module appears in "test_modules" in src/gpodder/unittests.py - for the example above, the unittests in src/gpodder/test/model.py are added as 'model'. For unit tests, coverage reporting happens for the tested module (that's why the test module name should mirror the module to be tested). [ RUNNING AND INSTALLATION ] To run gPodder from source, use.. bin/gpodder for the Gtk+ UI bin/gpodder --qml for the QML UI bin/gpo for the command-line interface To install gPodder system-wide, use "make install". By default, this will install *all* UIs and all translations. The following environment variables are processed by setup.py: LINGUAS space-separated list of languages to install GPODDER_INSTALL_UIS space-separated list of UIs to install GPODDER_MANPATH_NO_SHARE if set, install manpages to $PREFIX/man/man1 See setup.py for a list of recognized UIs. Example: Install the CLI and Gtk UI with German and Dutch translations: export LINGUAS="de nl" export GPODDER_INSTALL_UIS="cli gtk" make install The "make install" target also supports DESTDIR and PREFIX for installing into an alternative root (default /) and prefix (default /usr): make install DESTDIR=tmp/ PREFIX=/usr/local/ [ PYTHON 3 SUPPORT ] The CLI version of gPodder (bin/gpo) and the QML UI are compatible with Python 3 after converting the codebase with the 2to3 utility: 2to3 -w bin/* src share/gpodder/extensions You will also need a copy of "mygpoclient" converted using 2to3 and a copy of "feedparser" converted using 2to3 (see the feedparser README for details on how to get it set up on Python 3, including sgmllib). Please note that the Gtk UI is not compatible with Python 3 (it will be once we migrate the codebase to Gtk3/GObject Introspection). The QML UI has been tested with PySide (Git revision a90f3bc) and Python 3.2.2 - you can use the PySide buildscripts to build PySide: http://github.com/PySide/BuildScripts As of February 2012, Python 3 support is still experimental. Please report any bugs that you find to the gPodder bug tracker (see below). [ PORTABLE MODE / ROAMING PROFILES ] The run-time environment variable GPODDER_HOME is used to set the location for storing the database and downloaded files. This can be used for multiple configurations or to store the download directory directly on a MP3 player or USB disk: export GPODDER_HOME=/media/usbdisk/gpodder-data/ [ CHANGING THE DOWNLOAD DIRECTORY ] The run-time environment variable GPODDER_DOWNLOAD_DIR is used to set the location for storing the downloads only (independent of the data directory GPODDER_HOME): export GPODDER_DOWNLOAD_DIR=/media/BigDisk/Podcasts/ In this case, the database and settings will be stored in the default location, with the downloads stored in /media/BigDisk/Podcasts/. Another example would be to set both environment variables: export GPODDER_HOME=~/.config/gpodder/ export GPODDER_DOWNLOAD_DIR=~/Podcasts/ This will store the database and settings files in ~/.config/gpodder/ and the downloads in ~/Podcasts/. If GPODDER_DOWNLOAD_DIR is not set, $GPODDER_HOME/Downloads/ will be used if it is set. [ LOGGING ] By default, gPodder writes log files to $GPODDER_HOME/Logs/ and removes them after a certain amount of times. To avoid this behavior, you can set the environment variable GPODDER_WRITE_LOGS to "no", e.g: export GPODDER_WRITE_LOGS=no [ EXTENSIONS ] Extensions are normally loaded from gPodder's "extensions/" folder (in share/gpodder/extensions/) and from $GPODDER_HOME/Extensions/ - you can override this by setting an environment variable: export GPODDER_EXTENSIONS="/path/to/extension1.py extension2.py" In addition to that, if you want to disable loading of all extensions, you can do this by setting the following environment variable to a non- empty value: export GPODDER_DISABLE_EXTENSIONS=yes If you want to report a bug, please try to disable all extensions and check if the bug still appears to see if an extension causes the bug. [ TRANSLATIONS ] These instructions are mostly useful for the maintainer, but they are documented here in case you want to update translations yourself: To upload a changed translation template: make messages # update translations from source make clean # remove temporary files after "make messages" tx push --source # upload po/messages.pot to transifex.net To download a translation that has been updated: tx pull -l XX -f # download po/XX.po from transifex.net To generate Git commit commands for the translation updates: python tools/i18n/generate_commits.py The "tx" command is provided by the Transifex client (transifex-client in Debian/Ubuntu) which can be obtained from: http://help.transifex.com/features/client/ [ MORE INFORMATION ] - Homepage http://gpodder.org/ - Bug tracker http://bugs.gpodder.org/ - Mailing list http://freelists.org/list/gpodder - IRC channel #gpodder on irc.freenode.net ............................................................................ Last updated: 2013-02-12 by Thomas Perl gpodder-3.5.2/makefile0000644000175000017500000001133512220076757014270 0ustar thpthp00000000000000# # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # ########################################################################## BINFILE = bin/gpodder MANPAGE = share/man/man1/gpodder.1 GPODDER_SERVICE_FILE=share/dbus-1/services/org.gpodder.service GPODDER_SERVICE_FILE_IN=$(addsuffix .in,$(GPODDER_SERVICE_FILE)) GPODDER_DESKTOP_FILE=share/applications/gpodder.desktop GPODDER_DESKTOP_FILE_IN=$(addsuffix .in,$(GPODDER_DESKTOP_FILE)) GPODDER_DESKTOP_FILE_H=$(addsuffix .h,$(GPODDER_DESKTOP_FILE_IN)) MESSAGES = po/messages.pot POFILES = $(wildcard po/*.po) LOCALEDIR = share/locale MOFILES = $(patsubst po/%.po,$(LOCALEDIR)/%/LC_MESSAGES/gpodder.mo, $(POFILES)) UIFILES=$(wildcard share/gpodder/ui/gtk/*.ui) UIFILES_H=$(subst .ui,.ui.h,$(UIFILES)) QMLFILES=$(wildcard share/gpodder/ui/qml/*.qml \ share/gpodder/ui/qml/harmattan/org/gpodder/qmlui/*.qml \ share/gpodder/ui/qml/sailfish/org/gpodder/qmlui/*.qml) GETTEXT_SOURCE=$(wildcard src/gpodder/*.py \ src/gpodder/gtkui/*.py \ src/gpodder/gtkui/interface/*.py \ src/gpodder/gtkui/desktop/*.py \ src/gpodder/qmlui/*.py \ src/gpodder/webui/*.py \ src/gpodder/plugins/*.py \ share/gpodder/extensions/*.py) GETTEXT_SOURCE += $(UIFILES_H) GETTEXT_SOURCE += $(QMLFILES) GETTEXT_SOURCE += $(wildcard bin/*) GETTEXT_SOURCE += $(GPODDER_DESKTOP_FILE_H) DESTDIR ?= / PREFIX ?= /usr PYTHON ?= python HELP2MAN ?= help2man ########################################################################## help: @cat tools/make-help.txt ########################################################################## unittest: LC_ALL=C PYTHONPATH=src/ $(PYTHON) -m gpodder.unittests release: distclean $(PYTHON) setup.py sdist releasetest: unittest $(GPODDER_DESKTOP_FILE) $(POFILES) desktop-file-validate $(GPODDER_DESKTOP_FILE) sh tools/i18n/validate.sh $(GPODDER_SERVICE_FILE): $(GPODDER_SERVICE_FILE_IN) sed -e 's#__PREFIX__#$(PREFIX)#' $< >$@ $(GPODDER_DESKTOP_FILE): $(GPODDER_DESKTOP_FILE_IN) $(POFILES) intltool-merge -d -u po $< $@ $(GPODDER_DESKTOP_FILE_IN).h: $(GPODDER_DESKTOP_FILE_IN) intltool-extract --quiet --type=gettext/ini $< install: messages $(GPODDER_SERVICE_FILE) $(GPODDER_DESKTOP_FILE) $(PYTHON) setup.py install --root=$(DESTDIR) --prefix=$(PREFIX) --optimize=1 ########################################################################## manpage: $(MANPAGE) $(MANPAGE): src/gpodder/__init__.py $(BINFILE) $(HELP2MAN) --name="$(shell $(PYTHON) setup.py --description)" -N $(BINFILE) >$(MANPAGE) ########################################################################## messages: $(MOFILES) %.po: $(MESSAGES) msgmerge --silent $@ $< --output-file=$@ $(LOCALEDIR)/%/LC_MESSAGES/gpodder.mo: po/%.po @mkdir -p $(@D) msgfmt $< -o $@ %.ui.h: %.ui intltool-extract --quiet --type=gettext/glade $< $(MESSAGES): $(GETTEXT_SOURCE) xgettext -LPython -k_:1 -kN_:1 -kN_:1,2 -kn_:1,2 -o $(MESSAGES) $^ ########################################################################## # This only works in a Git working commit, and assumes that the local Git # HEAD has already been pushed to the main repository. It's mainly useful # for the gPodder maintainer to quickly generate a commit link that can be # posted online in bug trackers and mailing lists. headlink: @echo http://gpodder.org/commit/`git show-ref HEAD | head -c8` ########################################################################## clean: $(PYTHON) setup.py clean find src/ '(' -name '*.pyc' -o -name '*.pyo' ')' -exec rm '{}' + find src/ -type d -name '__pycache__' -exec rm -r '{}' + find share/gpodder/ui/ -name '*.ui.h' -exec rm '{}' + rm -f MANIFEST PKG-INFO .coverage messages.mo po/*.mo rm -f $(GPODDER_SERVICE_FILE) rm -f $(GPODDER_DESKTOP_FILE) rm -f $(GPODDER_DESKTOP_FILE_H) rm -rf build $(LOCALEDIR) distclean: clean rm -rf dist ########################################################################## .PHONY: help unittest release releasetest install manpage clean distclean messages headlink ########################################################################## gpodder-3.5.2/setup.py0000644000175000017500000001641012220076757014301 0ustar thpthp00000000000000#!/usr/bin/env python # # gPodder - A media aggregator and podcast client # Copyright (c) 2005-2013 Thomas Perl and the gPodder Team # # gPodder is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # gPodder is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import glob import os import re import sys from distutils.core import setup installing = ('install' in sys.argv and '--help' not in sys.argv) # Read the metadata from gPodder's __init__ module (doesn't need importing) main_module = open('src/gpodder/__init__.py').read() metadata = dict(re.findall("__([a-z_]+)__\s*=\s*'([^']+)'", main_module)) author, email = re.match(r'^(.*) <(.*)>$', metadata['author']).groups() class MissingFile(BaseException): pass def info(message, item=None): print '=>', message, item if item is not None else '' def find_data_files(uis, scripts): # Support for installing only a subset of translations linguas = os.environ.get('LINGUAS', None) if linguas is not None: linguas = linguas.split() info('Selected languages (from $LINGUAS):', linguas) for dirpath, dirnames, filenames in os.walk('share'): if not filenames: continue # Skip data folders if we don't want the corresponding UI share_gpodder_ui = os.path.join('share', 'gpodder', 'ui') if uis is not None and dirpath.startswith(share_gpodder_ui): dirparts = dirpath.split(os.sep) if not any(part in uis for part in dirparts): info('Skipping folder:', dirpath) continue # Skip translations if $LINGUAS is set share_locale = os.path.join('share', 'locale') if linguas is not None and dirpath.startswith(share_locale): _, _, language, _ = dirpath.split(os.sep, 3) if language not in linguas: info('Skipping translation:', language) continue # Skip desktop stuff if we don't have any UIs requiring it skip_folder = False uis_requiring_freedesktop = ('gtk', 'qml') freedesktop_folders = ('icons', 'dbus-1', 'applications') for folder in freedesktop_folders: share_folder = os.path.join('share', folder) if dirpath.startswith(share_folder) and uis is not None: if not any(ui in uis_requiring_freedesktop for ui in uis): info('Skipping freedesktop.org folder:', dirpath) skip_folder = True break if skip_folder: continue # Skip manpages if their scripts are not going to be installed share_man = os.path.join('share', 'man') if dirpath.startswith(share_man): def have_script(filename): if not filename.endswith('.1'): return True basename, _ = os.path.splitext(filename) result = any(os.path.basename(s) == basename for s in scripts) if not result: info('Skipping manpage without script:', filename) return result filenames = filter(have_script, filenames) def convert_filename(filename): filename = os.path.join(dirpath, filename) # Skip header files generated by "make messages" if filename.endswith('.h'): return None # Skip .in files, but check if their target exist if filename.endswith('.in'): filename = filename[:-3] if installing and not os.path.exists(filename): raise MissingFile(filename) return None return filename filenames = filter(None, map(convert_filename, filenames)) if filenames: # Some distros/ports install manpages into $PREFIX/man instead # of $PREFIX/share/man (e.g. FreeBSD). To allow this, we strip # the "share/" part if the variable GPODDER_MANPATH_NO_SHARE is # set to any value in the environment. if dirpath.startswith(share_man): if 'GPODDER_MANPATH_NO_SHARE' in os.environ: dirpath = dirpath.replace(share_man, 'man') yield (dirpath, filenames) def find_packages(uis): src_gpodder = os.path.join('src', 'gpodder') for dirpath, dirnames, filenames in os.walk(src_gpodder): if '__init__.py' not in filenames: continue skip = False dirparts = dirpath.split(os.sep) dirparts.pop(0) package = '.'.join(dirparts) # Extract all parts of the package name ending in "ui" ui_parts = filter(lambda p: p.endswith('ui'), dirparts) if uis is not None and ui_parts: # Strip the trailing "ui", e.g. "gtkui" -> "gtk" folder_uis = map(lambda p: p[:-2], ui_parts) for folder_ui in folder_uis: if folder_ui not in uis: info('Skipping package:', package) skip = True break if not skip: yield package def find_scripts(uis): # Functions for scripts to check if they should be installed file_checks = { 'gpo': lambda uis: 'cli' in uis, 'gpodder': lambda uis: any(ui in uis for ui in ('qml', 'gtk')), } for dirpath, dirnames, filenames in os.walk('bin'): for filename in filenames: # If we have a set of uis, check if we can skip this file if uis is not None and filename in file_checks: if not file_checks[filename](uis): info('Skipping script:', filename) continue yield os.path.join(dirpath, filename) # Recognized UIs: cli, gtk, qml, web (default: install all UIs) uis = os.environ.get('GPODDER_INSTALL_UIS', None) if uis is not None: uis = uis.split() # The CLI has a hard dependency on the Web UI if 'cli' in uis and 'web' not in uis: info('Adding Web UI as dependency of CLI') uis.append('web') info('Selected UIs (from $GPODDER_INSTALL_UIS):', uis) try: packages = list(sorted(find_packages(uis))) scripts = list(sorted(find_scripts(uis))) data_files = list(sorted(find_data_files(uis, scripts))) except MissingFile, mf: print >>sys.stderr, """ Missing file: %s If you want to install, use "make install" instead of using setup.py directly. See the README file for more information. """ % mf.message sys.exit(1) setup( name = 'gpodder', version = metadata['version'], description = metadata['tagline'], license = metadata['license'], url = metadata['url'], author = author, author_email = email, package_dir = {'': 'src'}, packages = packages, scripts = scripts, data_files = data_files, ) gpodder-3.5.2/PKG-INFO0000644000175000017500000000042012220346122013640 0ustar thpthp00000000000000Metadata-Version: 1.0 Name: gpodder Version: 3.5.2 Summary: Media aggregator and podcast client Home-page: http://gpodder.org/ Author: Thomas Perl Author-email: thp@gpodder.org License: GNU General Public License, version 3 or later Description: UNKNOWN Platform: UNKNOWN