kuuko pushed a commit to branch master. http://git.enlightenment.org/apps/epour.git/commit/?id=8fa5289b06db4806b03d152b7b1eea4efd5380e5
commit 8fa5289b06db4806b03d152b7b1eea4efd5380e5 Author: Kai Huuhko <[email protected]> Date: Wed Apr 22 07:31:01 2015 +0300 Add I18N support to gui with gettext --- epour/gui/Preferences.py | 58 ++--- epour/gui/TorrentProps.py | 32 +-- epour/gui/TorrentSelector.py | 233 +++++++++++++++--- epour/gui/Widgets.py | 12 +- epour/gui/__init__.py | 94 ++++---- po/epour.pot | 555 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 859 insertions(+), 125 deletions(-) diff --git a/epour/gui/Preferences.py b/epour/gui/Preferences.py index 4efeb67..322b1ee 100644 --- a/epour/gui/Preferences.py +++ b/epour/gui/Preferences.py @@ -94,7 +94,7 @@ class PreferencesGeneral(PreferencesDialog): self.session = session conf = session.conf PreferencesDialog.__init__( - self, "Epour General Preferences") + self, _("Epour General Preferences")) limits = Limits(self, session) ports = ListenPorts(self, session) @@ -108,7 +108,7 @@ class PreferencesGeneral(PreferencesDialog): ) completed_sel_enabled = Check( - self, size_hint_align=ALIGN_LEFT, text="Move completed torrents", + self, size_hint_align=ALIGN_LEFT, text=_("Move completed torrents"), ) completed_sel_enabled.state = conf.getboolean( "Settings", "move_completed_enabled" @@ -116,7 +116,7 @@ class PreferencesGeneral(PreferencesDialog): completed_sel = StorageSelector( self, - "Completed torrents", + _("Completed torrents"), lambda: conf.get("Settings", "move_completed_path"), lambda x: conf.set("Settings", "move_completed_path", x), size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ @@ -145,7 +145,7 @@ class PreferencesGeneral(PreferencesDialog): chk1 = Check(self) chk1.size_hint_align = ALIGN_LEFT - chk1.text = "Delete original .torrent file when added" + chk1.text = _("Delete original .torrent file when added") chk1.state = conf.getboolean("Settings", "delete_original") chk1.callback_changed_add(lambda x: conf.set( "Settings", "delete_original", str(bool(chk1.state)) @@ -153,7 +153,7 @@ class PreferencesGeneral(PreferencesDialog): chk2 = Check(self) chk2.size_hint_align = ALIGN_LEFT - chk2.text = "Ask for confirmation on exit" + chk2.text = _("Ask for confirmation on exit") chk2.state = conf.getboolean("Settings", "confirm_exit") chk2.callback_changed_add(lambda x: conf.set( "Settings", "confirm_exit", str(bool(chk2.state)) @@ -162,7 +162,7 @@ class PreferencesGeneral(PreferencesDialog): chk3 = Check(self) chk3.size_hint_align = ALIGN_LEFT chk3.text = ( - "Torrents to be added from dbus or command line open a dialog") + _("Torrents to be added from dbus or command line open a dialog")) chk3.state = conf.getboolean("Settings", "add_dialog_enabled") chk3.callback_changed_add(lambda x: conf.set( "Settings", "add_dialog_enabled", str(bool(chk3.state)) @@ -197,7 +197,7 @@ class StorageSelector(Frame): dlsel = FsButton( self, size_hint_align=FILL_HORIZ, inwin_mode=False, - text="Change path", folder_only=True, expandable=False + text=_("Change path"), folder_only=True, expandable=False ) dlsel.path = read() @@ -234,7 +234,7 @@ class ListenPorts(Frame): self.session = session self.size_hint_align = FILL_HORIZ - self.text = "Listen port (range)" + self.text = _("Listen port (range)") #port = session.listen_port() @@ -273,16 +273,16 @@ class PreferencesProxy(PreferencesDialog): def __init__(self, parent, session): PreferencesDialog.__init__( - self, "Epour Proxy Preferences") + self, _("Epour Proxy Preferences")) proxies = [ - ["Proxy for torrent peer connections", + [_("Proxy for torrent peer connections"), session.peer_proxy, session.set_peer_proxy], - ["Proxy for torrent web seed connections", + [_("Proxy for torrent web seed connections"), session.web_seed_proxy, session.set_web_seed_proxy], - ["Proxy for tracker connections", + [_("Proxy for tracker connections"), session.tracker_proxy, session.set_tracker_proxy], - ["Proxy for DHT connections", + [_("Proxy for DHT connections"), session.dht_proxy, session.set_dht_proxy], ] @@ -317,7 +317,7 @@ class ProxyGroup(Frame): ps = rfunc() - l = Label(self, text="Proxy type", size_hint_align=ALIGN_LEFT) + l = Label(self, text=_("Proxy type"), size_hint_align=ALIGN_LEFT) l.show() ptype = Hoversel(parent, size_hint_align=FILL_HORIZ) ptype.text = str(lt.proxy_type.values[ps.type]) @@ -327,7 +327,7 @@ class ProxyGroup(Frame): t.pack(l, 0, 0, 1, 1) t.pack(ptype, 1, 0, 1, 1) - l = Label(self, text="Hostname", size_hint_align=ALIGN_LEFT) + l = Label(self, text=_("Hostname"), size_hint_align=ALIGN_LEFT) l.show() phost = Entry( parent, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, @@ -338,7 +338,7 @@ class ProxyGroup(Frame): t.pack(l, 0, 1, 1, 1) t.pack(phost, 1, 1, 1, 1) - l = Label(self, text="Port", size_hint_align=ALIGN_LEFT) + l = Label(self, text=_("Port"), size_hint_align=ALIGN_LEFT) l.show() pport = Spinner(parent, size_hint_align=FILL_HORIZ, min_max=(0, 65535)) pport.value = ps.port @@ -346,7 +346,7 @@ class ProxyGroup(Frame): t.pack(l, 0, 2, 1, 1) t.pack(pport, 1, 2, 1, 1) - l = Label(self, text="Username", size_hint_align=ALIGN_LEFT) + l = Label(self, text=_("Username"), size_hint_align=ALIGN_LEFT) l.show() puser = Entry( parent, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, @@ -357,7 +357,7 @@ class ProxyGroup(Frame): t.pack(l, 0, 3, 1, 1) t.pack(puser, 1, 3, 1, 1) - l = Label(self, text="Password", size_hint_align=ALIGN_LEFT) + l = Label(self, text=_("Password"), size_hint_align=ALIGN_LEFT) l.show() ppass = Entry( parent, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, @@ -369,7 +369,7 @@ class ProxyGroup(Frame): t.pack(ppass, 1, 4, 1, 1) l = Label( - self, text="Proxy hostname lookups", size_hint_align=ALIGN_LEFT) + self, text=_("Proxy hostname lookups"), size_hint_align=ALIGN_LEFT) l.show() phostlu = Check(parent, size_hint_align=ALIGN_RIGHT) phostlu.state = ps.proxy_hostnames @@ -378,7 +378,7 @@ class ProxyGroup(Frame): t.pack(phostlu, 1, 5, 1, 1) l = Label( - self, text="Proxy peer connections", size_hint_align=ALIGN_LEFT) + self, text=_("Proxy peer connections"), size_hint_align=ALIGN_LEFT) l.show() ppeer = Check(parent, size_hint_align=ALIGN_RIGHT) ppeer.state = ps.proxy_peer_connections @@ -388,7 +388,7 @@ class ProxyGroup(Frame): entries = [ptype, phost, pport, puser, ppass, phostlu, ppeer] - save = Button(parent, text="Apply") + save = Button(parent, text=_("Apply")) save.callback_clicked_add(self.save_conf, wfunc, entries) save.show() t.pack(save, 0, 7, 2, 1) @@ -407,7 +407,7 @@ class ProxyGroup(Frame): p.proxy_hostnames = phostlu.state p.proxy_peer_connections = ppeer.state - Information(self.top_widget, "%s settings saved" % (ptype)) + Information(self.top_widget, _("%s settings saved") % (ptype)) wfunc(p) @@ -419,7 +419,7 @@ class EncryptionSettings(Frame): Frame.__init__(self, parent) self.size_hint_align = FILL_HORIZ - self.text = "Encryption settings" + self.text = _("Encryption settings") pes = self.pes = session.get_pe_settings() @@ -431,32 +431,32 @@ class EncryptionSettings(Frame): lt.enc_level.both inc = self.inc = ActSWithLabel( - parent, "Incoming encryption", enc_values, pes.in_enc_policy + parent, _("Incoming encryption"), enc_values, pes.in_enc_policy ) b.pack_end(inc) inc.show() out = self.out = ActSWithLabel( - parent, "Outgoing encryption", enc_values, pes.out_enc_policy + parent, _("Outgoing encryption"), enc_values, pes.out_enc_policy ) b.pack_end(out) out.show() lvl = self.lvl = ActSWithLabel( - parent, "Allowed encryption level", enc_levels, + parent, _("Allowed encryption level"), enc_levels, pes.allowed_enc_level ) b.pack_end(lvl) lvl.show() prf = self.prf = Check( - parent, style="toggle", text="Prefer RC4 ecryption", + parent, style="toggle", text=_("Prefer RC4 ecryption"), state=pes.prefer_rc4 ) b.pack_end(prf) prf.show() - a_btn = Button(parent, text="Apply") + a_btn = Button(parent, text=_("Apply")) a_btn.callback_clicked_add(self.apply) b.pack_end(a_btn) a_btn.show() @@ -480,7 +480,7 @@ class PreferencesSession(PreferencesDialog): def __init__(self, parent, session): PreferencesDialog.__init__( - self, "Epour Session Preferences") + self, _("Epour Session Preferences")) self.session = session diff --git a/epour/gui/TorrentProps.py b/epour/gui/TorrentProps.py index 45a3d1d..116a231 100644 --- a/epour/gui/TorrentProps.py +++ b/epour/gui/TorrentProps.py @@ -84,7 +84,7 @@ class FileClass(GenlistItemClass): h = obj.data["handle"] if part == "elm.swallow.icon": check = Check(obj) - check.tooltip_text_set("Enable/disable file download") + check.tooltip_text_set(_("Enable/disable file download")) check.state = h.file_priority(n) check.callback_changed_add(lambda x: h.file_priority(n, x.state)) return check @@ -118,7 +118,7 @@ class TorrentProps(StandardWindow): def __init__(self, h): if not h.is_valid(): - Information(self, "Invalid torrent handle.") + Information(self, _("Invalid torrent handle.")) return StandardWindow.__init__( @@ -143,7 +143,7 @@ class TorrentProps(StandardWindow): box.pack_end(tname) if h.has_metadata(): - f = Frame(self, text="Torrent info", size_hint_align=FILL_HORIZ) + f = Frame(self, text=_("Torrent info"), size_hint_align=FILL_HORIZ) ti = TorrentInfo( f, h, size_hint_align=FILL_HORIZ) f.content = ti @@ -151,7 +151,7 @@ class TorrentProps(StandardWindow): ti.show() f.show() - f = Frame(self, text="Torrent settings", size_hint_align=FILL_HORIZ) + f = Frame(self, text=_("Torrent settings"), size_hint_align=FILL_HORIZ) ts = TorrentSettings( f, h, size_hint_align=FILL_HORIZ) f.content = ts @@ -159,7 +159,7 @@ class TorrentProps(StandardWindow): ts.show() f.show() - f = Frame(self, text="Torrent status", size_hint_align=FILL_HORIZ) + f = Frame(self, text=_("Torrent status"), size_hint_align=FILL_HORIZ) ts = TorrentStatus(f, h, size_hint_align=FILL_HORIZ) f.content = ts box.pack_end(f) @@ -168,7 +168,7 @@ class TorrentProps(StandardWindow): magnet_uri = lt.make_magnet_uri(h) - f = Frame(self, size_hint_align=FILL_HORIZ, text="Magnet URI") + f = Frame(self, size_hint_align=FILL_HORIZ, text=_("Magnet URI")) me_box = Box(f, horizontal=True) me = Entry( me_box, size_hint_align=FILL_HORIZ, size_hint_weight=EXPAND_HORIZ, @@ -176,7 +176,7 @@ class TorrentProps(StandardWindow): ) me_box.pack_end(me) me.show() - me_btn = Button(me_box, text="Copy") + me_btn = Button(me_box, text=_("Copy")) me_btn.callback_clicked_add( lambda x: me.top_widget.cnp_selection_set( ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_TEXT, me.text @@ -203,7 +203,7 @@ class TorrentFiles(StandardWindow): StandardWindow.__init__( self, "epour", - "Epour - Files for torrent: %s" % (h.name()), + _("Epour - Files for torrent: %s") % (h.name()), size=(SCALE * 480, SCALE * 320), autodel=True ) @@ -245,11 +245,11 @@ class TorrentFiles(StandardWindow): filelist.show() - sel_all = Button(self, text="Select all") + sel_all = Button(self, text=_("Select all")) sel_all.callback_clicked_add(self.select_all_cb, filelist, h, True) sel_all.show() - sel_none = Button(self, text="Select none") + sel_none = Button(self, text=_("Select none")) sel_none.callback_clicked_add(self.select_all_cb, filelist, h, False) sel_none.show() @@ -388,7 +388,7 @@ class TorrentInfo(Box): tpriv = Check(self) tpriv.size_hint_align = 0.0, 0.0 - tpriv.text = "Private" + tpriv.text = _("Private") tpriv.tooltip_text_set( "Whether this torrent is private,<br>" "i.e. it should not be distributed on the<br>" @@ -439,13 +439,13 @@ class TorrentSettings(Box): l = Label(t) l.size_hint_align = ALIGN_LEFT - l.text = "Storage path" + l.text = _("Storage path") t.pack(l, 0, 0, 1, 1) l.show() fs = FsEntry(t) fs.size_hint_align = FILL_HORIZ - fs.text = "Select" + fs.text = _("Select") fs.folder_only = True fs.expandable = False fs.path = handle.save_path() @@ -497,7 +497,7 @@ class TorrentSettings(Box): l.show() w = UnitSpinner(self, "B/s", 1024, UnitSpinner.binary_prefixes) w.size_hint_align = FILL_HORIZ - w.spinner.special_value_add(0, "disabled") + w.spinner.special_value_add(0, _("disabled")) w.set_value(getattr(handle, getter)()) setter = getattr(handle, self.handle_unit_spinners[getter]) w.callback_changed_add(lambda x, y, z=setter: z(y)) @@ -533,8 +533,8 @@ class TorrentSettings(Box): class TorrentStatus(Table): state_str = ( - 'Queued', 'Checking', 'Downloading metadata', 'Downloading', - 'Finished', 'Seeding', 'Allocating', 'Checking resume data' + _('Queued'), _('Checking'), _('Downloading metadata'), _('Downloading'), + _('Finished'), _('Seeding'), _('Allocating'), _('Checking resume data') ) ignored_keys = ( diff --git a/epour/gui/TorrentSelector.py b/epour/gui/TorrentSelector.py index 197af88..18b7cee 100644 --- a/epour/gui/TorrentSelector.py +++ b/epour/gui/TorrentSelector.py @@ -57,9 +57,164 @@ log = logging.getLogger("epour.gui") class TorrentSelector(StandardWindow): + names = { + 1: _("Seed Mode"), + 2: "Override Resume Data", + 4: "Upload Mode", + 8: _("Share Mode"), + 16: _("Apply IP Filter"), + 32: "Start Paused", + 64: "Auto Managed", + 128: _("Duplicate Is Error"), + 256: "Merge Resume Trackers", + 512: "Updates Subscribe", + 1024: _("Super Seeding"), + 2048: _("Sequential Download"), + 4096: _("Use Resume Save Path"), + } + + tooltips = { + 1: utf8_to_markup(_( + +'''If Seed Mode is set, Epour will assume that all files are +present for this torrent and that they all match the hashes in the +torrent file. Each time a peer requests to download a block, the +piece is verified against the hash, unless it has been verified +already. If a hash fails, the torrent will automatically leave the +seed mode and recheck all the files. The use case for this mode is +if a torrent is created and seeded, or if the user already know +that the files are complete, this is a way to avoid the initial +file checks, and significantly reduce the startup time. + +Setting Seed Mode on a torrent without metadata (a .torrent +file) is a no-op and will be ignored.''' + + )), + 2: utf8_to_markup( + +'''If Override Resume Data is set, flags set for this torrent in this +add_torrent_params object will take precedence over whatever states +are saved in the resume data. For instance, the paused, +auto_managed, sequential_download, seed_mode, super_seeding, +max_uploads, max_connections, upload_limit and download_limit are +all affected by this flag. The intention of this flag is to have +any field in add_torrent_params configuring the torrent override +the corresponding configuration from the resume file, with the one +exception of save resume data, which has its own flag (for historic +reasons).''' + + ), + 4: utf8_to_markup( + +'''If Upload Mode is set, the torrent will be initialized in upload- +mode, which means it will not make any piece requests. This state +is typically entered on disk I/O errors, and if the torrent is also +auto managed, it will be taken out of this state periodically. This +mode can be used to avoid race conditions when adjusting priorities +of pieces before allowing the torrent to start downloading. + +If the torrent is auto-managed, the torrent will eventually be +taken out of upload-mode, regardless of how it got there. If it's +important to manually control when the torrent leaves upload mode, +don't make it auto managed.''' + + ), + 8: utf8_to_markup(_( + +'''Determines if the torrent should be added in share mode or not. +Share mode indicates that we are not interested in downloading the +torrent, but merely want to improve our share ratio (i.e. increase +it). A torrent started in share mode will do its best to never +download more than it uploads to the swarm. If the swarm does not +have enough demand for upload capacity, the torrent will not +download anything. This mode is intended to be safe to add any +number of torrents to, without manual screening, without the risk +of downloading more than is uploaded. + +A torrent in share mode sets the priority to all pieces to 0, +except for the pieces that are downloaded, when pieces are decided +to be downloaded. This affects the progress bar, which might be set +to "100% finished" most of the time. Do not change file or piece +priorities for torrents in share mode, it will make it not work. + +The share mode has one setting, the share ratio target.''' + + )), + 16: utf8_to_markup(_( + +'''Determines if the IP filter should apply to this torrent or not. By +default all torrents are subject to filtering by the IP filter +(i.e. this flag is set by default). This is useful if certain +torrents needs to be excempt for some reason, being an auto-update +torrent for instance.''' + + )), + 32: utf8_to_markup( + +'''Specifies whether or not the torrent is to be started in a paused +state. I.e. it won't connect to the tracker or any of the peers +until it's resumed. This is typically a good way of avoiding race +conditions when setting configuration options on torrents before +starting them.''' + + ), + 64: utf8_to_markup( + +'''If the torrent is auto-managed, the torrent may be resumed at any +point, regardless of how it paused. If it's important to manually +control when the torrent is paused and resumed, don't make it auto +managed. + +If auto-managed, the torrent will be queued, started and seeded +automatically by libtorrent. When this is set, the torrent should +also be started as paused. The default queue order is the order the +torrents were added. They are all downloaded in that order. For +more details, see queuing. + +If you pass in resume data, the auto-managed state of the torrent +when the resume data was saved will override the auto-managed state +you pass in here. You can override this by setting +Override Resume Data.''' + + ), + # 128: _(""), + 256: utf8_to_markup( + +'''Defaults to off and specifies whether tracker URLs loaded from +resume data should be added to the trackers in the torrent or +replace the trackers.''' + + ), + 512: utf8_to_markup( + +'''On by default and means that this torrent will be part of state +updates when calling post_torrent_updates().''' + + ), + 1024: utf8_to_markup(_( + +'''Sets the torrent into super seeding mode. If the torrent is not a +seed, this flag has no effect.''' + + )), + 2048: utf8_to_markup(_( + +'''Sets the sequential download state for the torrent.''' + + )), + 4096: utf8_to_markup(_( + +'''If this flag is set, the save path from the resume data file, +if present, is honored. This defaults to not being set, in +which case the save_path specified in add_torrent_params is +always used.''' + + )), + } + def __init__(self, parent, session, t_uri=None): StandardWindow.__init__( - self, "epour", "Epour - Add Torrent", + self, "addtorrent", _("Add Torrent"), size=(scale * 400, scale * 400), autodel=True ) @@ -75,7 +230,9 @@ class TorrentSelector(StandardWindow): scrol.content = box - hbox = Box(box, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, horizontal=True) + hbox = Box( + box, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, + horizontal=True) box.pack_end(hbox) hbox.show() @@ -83,7 +240,7 @@ class TorrentSelector(StandardWindow): box, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, single_line=True, scrollable=True ) - uri_entry.part_text_set("guide", "Enter file path / magnet URI / info hash") + uri_entry.part_text_set("guide", _("Enter torrent file path / magnet URI / info hash")) if t_uri: uri_entry.entry = utf8_to_markup(t_uri) hbox.pack_end(uri_entry) @@ -92,14 +249,14 @@ class TorrentSelector(StandardWindow): if t_uri: uri_entry.entry = t_uri - fsb = Button(box, text="Select torrent file") + fsb = Button(box, text=_("Select file")) fsb.callback_clicked_add(lambda x: TorrentFs(self, uri_entry)) hbox.pack_end(fsb) fsb.show() options = Frame( self, size_hint_weight=EXPAND_HORIZ, size_hint_align=FILL_HORIZ, - text=u"Advanced Options \u25BA", collapse=True + text=_("Advanced Options") + u" \u25BA", collapse=True ) box.pack_end(options) options.show() @@ -121,18 +278,23 @@ class TorrentSelector(StandardWindow): def entry_cb(e, key): self.add_dict[key] = e.entry - for n in "name", "trackerid": + for v, t in { + "name": _("Name"), + "trackerid": _("Tracker ID") + }.items(): e = Entry(opt_box, size_hint_align=FILL_HORIZ) - e.part_text_set("guide", n) - e.callback_changed_user_add(entry_cb, n) + e.part_text_set("guide", t) + e.callback_changed_user_add(entry_cb, v) opt_box.pack_end(e) e.show() def fs_cb(fs, key): self.add_dict[key] = fs.path + # Downloaded data is saved in this path + title = _("Data Save Path") save_path = FsEntry( - opt_box, size_hint_align=FILL_HORIZ, text="Save path", + opt_box, size_hint_align=FILL_HORIZ, text=title, folder_only=True, expandable=False ) save_path.path = session.conf.get("Settings", "storage_path") @@ -140,23 +302,35 @@ class TorrentSelector(StandardWindow): opt_box.pack_end(save_path) save_path.show() - self.add_dict["flags"] = \ - add_torrent_params_flags_t.flag_apply_ip_filter + \ - add_torrent_params_flags_t.flag_update_subscribe + \ - add_torrent_params_flags_t.flag_duplicate_is_error + \ + self.add_dict["flags"] = ( + add_torrent_params_flags_t.flag_apply_ip_filter + + add_torrent_params_flags_t.flag_update_subscribe + + add_torrent_params_flags_t.flag_duplicate_is_error + add_torrent_params_flags_t.flag_auto_managed + ) def option_flag_cb(c, flag): self.add_dict["flags"] = self.add_dict["flags"] ^ flag for name, flag in add_torrent_params_flags_t.names.items(): - if name == "flag_auto_managed" or name == "flag_update_subscribe": + if ( + name == "flag_auto_managed" or + name == "flag_update_subscribe" or + name == "flag_override_resume_data" or + name == "flag_merge_resume_trackers" or + name == "flag_paused" or + name == "flag_upload_mode" or + name == "flag_use_resume_save_path" + ): continue c = Check( opt_box, size_hint_align=(0.0, 0.5), - text=" ".join(name.split("_")[1:]).capitalize(), + text=self.names.get(int(flag), " ".join(name.split("_")[1:]).capitalize()), state=bool(self.add_dict["flags"] & int(flag)) ) + if int(flag) in self.tooltips: + c.tooltip_text_set(self.tooltips[int(flag)]) + c.tooltip_window_mode_set(True) c.callback_changed_add(option_flag_cb, int(flag)) opt_box.pack_end(c) c.show() @@ -166,29 +340,30 @@ class TorrentSelector(StandardWindow): def spin_cb(s, key): self.add_dict[key] = s.value - for n in ( - "max_uploads", "max_connections" - ): + for v, t in { + "max_uploads": _("Max Uploads"), + "max_connections": _("Max Connections") + }.items(): s = Spinner( - opt_box, size_hint_align=FILL_HORIZ, - text=n.replace("_", " ").capitalize(), - min_max=(0, INT_MAX), label_format=n + ": %0.f" + opt_box, size_hint_align=FILL_HORIZ, min_max=(0, INT_MAX), + label_format=t + ": %0.f" ) - s.callback_changed_add(spin_cb, n) + s.callback_changed_add(spin_cb, v) opt_box.pack_end(s) s.show() - for n in ( - "upload_limit", "download_limit" - ): + for v, t in { + "upload_limit": _("Upload Limit"), + "download_limit": _("Download Limit") + }.items(): s = UnitSpinner(opt_box, "B/s", 1024, UnitSpinner.binary_prefixes) s.size_hint_weight = EXPAND_HORIZ s.size_hint_align = FILL_HORIZ s.set_value(0) s.callback_changed_add( - lambda x, y: self.add_dict.__setitem__(n, y) + lambda x, y: self.add_dict.__setitem__(v, y) ) - s.spinner.label_format = n + ": %0.f" + s.spinner.label_format = t + ": %0.f" opt_box.pack_end(s) s.show() @@ -205,11 +380,11 @@ class TorrentSelector(StandardWindow): size_hint_align=FILL_HORIZ, horizontal=True ) - ok_btn = Button(bbox, text="Ok", size_hint_align=(1.0, 0.5)) + ok_btn = Button(bbox, text=_("Ok"), size_hint_align=(1.0, 0.5)) bbox.pack_end(ok_btn) ok_btn.show() - cancel_btn = Button(bbox, text="Cancel", size_hint_align=(1.0, 0.5)) + cancel_btn = Button(bbox, text=_("Cancel"), size_hint_align=(1.0, 0.5)) bbox.pack_end(cancel_btn) cancel_btn.show() diff --git a/epour/gui/Widgets.py b/epour/gui/Widgets.py index b2bd7d9..6e6a178 100644 --- a/epour/gui/Widgets.py +++ b/epour/gui/Widgets.py @@ -103,7 +103,7 @@ class Information(Notify): l.show() self.content = l if button: - xbtn = Button(b, text="Close") + xbtn = Button(b, text=_("Close")) xbtn.callback_clicked_add(lambda x: self.delete()) b.pack_end(xbtn) self.timeout = timeout @@ -116,7 +116,7 @@ class Error(Popup): self.part_text_set("title,text", title) self.text = text b = Button(self) - b.text = "OK" + b.text = _("OK") b.callback_clicked_add(lambda x: self.delete()) self.part_content_set("button1", b) self.show() @@ -125,14 +125,14 @@ class Error(Popup): class ConfirmExit(Popup): def __init__(self, parent, exit_func): super(self.__class__, self).__init__(parent) - self.part_text_set("title,text", "Confirm exit") - self.text = "Are you sure you wish to exit Epour?" + self.part_text_set("title,text", _("Confirm exit")) + self.text = _("Are you sure you wish to exit Epour?") b = Button(self) - b.text = "Yes" + b.text = _("Yes") b.callback_clicked_add(lambda x: exit_func()) self.part_content_set("button1", b) b = Button(self) - b.text = "No" + b.text = _("No") b.callback_clicked_add(lambda x: self.delete()) self.part_content_set("button2", b) self.show() diff --git a/epour/gui/__init__.py b/epour/gui/__init__.py index 87a131e..37be299 100644 --- a/epour/gui/__init__.py +++ b/epour/gui/__init__.py @@ -22,6 +22,8 @@ import cgi import logging from datetime import timedelta, datetime +import gettext +gettext.install("epour", unicode=True) import libtorrent as lt @@ -85,7 +87,7 @@ class MainInterface(object): tb.menu_parent = win item = tb.item_append( - "document-new", "Add torrent", + "document-new", _("Add torrent"), lambda x, y: self.add_torrent() ) @@ -98,11 +100,11 @@ class MainInterface(object): del it.state item = tb.item_append( - "media-playback-pause", "Pause Session", + "media-playback-pause", _("Pause Session"), lambda tb, it: pause_session(it) ) item.state_add( - "media-playback-start", "Resume Session", + "media-playback-start", _("Resume Session"), lambda tb, it: resume_session(it) ) @@ -118,22 +120,22 @@ class MainInterface(object): from .Preferences import PreferencesSession PreferencesSession(self, self.session).show() - item = tb.item_append("preferences-system", "Preferences") + item = tb.item_append("preferences-system", _("Preferences")) item.menu = True item.menu.item_add( - None, "General", "preferences-system", + None, _("General"), "preferences-system", lambda o, i: prefs_general_cb() ) item.menu.item_add( - None, "Proxy", "preferences-system", + None, _("Proxy"), "preferences-system", lambda o, i: prefs_proxy_cb() ) item.menu.item_add( - None, "Session", "preferences-system", + None, _("Session"), "preferences-system", lambda o, i: prefs_session_cb() ) - item = tb.item_append("application-exit", "Exit", + item = tb.item_append("application-exit", _("Exit"), lambda tb, it: elm.exit()) mbox.pack_start(tb) @@ -217,7 +219,7 @@ class MainInterface(object): "state_changed_alert", state_changed_cb) def torrent_finished_cb(a): - msg = "Torrent {} has finished downloading.".format( + msg = _("Torrent {} has finished downloading.").format( cgi.escape(a.handle.name()) ) log.info(msg) @@ -330,7 +332,8 @@ class SessionStatus(Table): self.pack(ses_pause_ic, 1, 0, 1, 1) ses_pause_ic.show() - title_l = Label(parent, text="<b>Session</b>") + t = _("Session") + title_l = Label(parent, text="<b>%s</b>" % t) self.pack(title_l, 0, 0, 1, 1) title_l.show() @@ -360,7 +363,7 @@ class SessionStatus(Table): self.pack(u_l, 1, 2, 1, 1) u_l.show() - peer_t = Label(parent, text="Peer connections") + peer_t = Label(parent, text=_("Peer connections")) self.pack(peer_t, 0, 3, 1, 1) peer_t.show() @@ -368,7 +371,7 @@ class SessionStatus(Table): self.pack(peer_l, 1, 3, 1, 1) peer_l.show() - uploads_t = Label(parent, text="Upload slots") + uploads_t = Label(parent, text=_("Upload slots")) self.pack(uploads_t, 0, 4, 1, 1) uploads_t.show() @@ -377,7 +380,7 @@ class SessionStatus(Table): self.pack(uploads_l, 1, 4, 1, 1) uploads_l.show() - listen_t = Label(parent, text="Listening") + listen_t = Label(parent, text=_("Listening")) self.pack(listen_t, 0, 5, 1, 1) listen_t.show() @@ -422,8 +425,9 @@ class SessionStatus(Table): class TorrentClass(GenlistItemClass): state_str = ( - 'Queued', 'Checking', 'Downloading metadata', 'Downloading', - 'Finished', 'Seeding', 'Allocating', 'Checking resume data' + _('Queued'), _('Checking'), _('Downloading metadata'), + _('Downloading'), _('Finished'), _('Seeding'), _('Allocating'), + _('Checking resume data') ) log = logging.getLogger("epour.gui.torrent_list") @@ -443,14 +447,14 @@ class TorrentClass(GenlistItemClass): ) elif part == "elm.text.sub": if not h.is_valid(): - return "Invalid torrent" + return _("Invalid torrent") s = h.status(0) qp = h.queue_position() if qp == -1: qp = "seeding" - return "{:.0%} complete, ETA: {} " \ - "(Down: {}/s Up: {}/s Queue pos: {})".format( + return _("{:.0%} complete, ETA: {} " + "(Down: {}/s Up: {}/s Queue pos: {})").format( s.progress, timedelta(seconds=self.get_eta(s)), intrepr(s.download_payload_rate, precision=0), @@ -530,35 +534,35 @@ class ItemMenu(Menu): self.item_add( None, - "Resume" if h.is_paused() else "Pause", + _("Resume") if h.is_paused() else _("Pause"), None, self.resume_torrent_cb if h.is_paused() else self.pause_torrent_cb, h ) - q = self.item_add(None, "Queue", None, None) + q = self.item_add(None, _("Queue"), None, None) self.item_add( - q, "Up", None, lambda x, y: h.queue_position_up() + q, _("Up"), None, lambda x, y: h.queue_position_up() ) self.item_add( - q, "Down", None, lambda x, y: h.queue_position_down() + q, _("Down"), None, lambda x, y: h.queue_position_down() ) self.item_add( - q, "Top", None, lambda x, y: h.queue_position_top() + q, _("Top"), None, lambda x, y: h.queue_position_top() ) self.item_add( - q, "Bottom", None, lambda x, y: h.queue_position_bottom() + q, _("Bottom"), None, lambda x, y: h.queue_position_bottom() ) rem = self.item_add( - None, "Remove torrent", None, + None, _("Remove torrent"), None, self.remove_torrent_cb, item, session, h, False ) self.item_add( - rem, "and data files", None, + rem, _("and data files"), None, self.remove_torrent_cb, item, session, h, True ) self.item_separator_add(None) it = self.item_add( - None, "Force reannounce", None, lambda x, y: h.force_reannounce() + None, _("Force reannounce"), None, lambda x, y: h.force_reannounce() ) it.tooltip_text_set( "<b>Force reannounce</b> will force this torrent<br>" @@ -571,11 +575,11 @@ class ItemMenu(Menu): "trackers minimum re-announce interval settings." ) self.item_add( - None, "Force DHT reannounce", None, + None, _("Force DHT reannounce"), None, lambda x, y: h.force_dht_announce() ) it = self.item_add( - None, "Scrape tracker", None, + None, _("Scrape tracker"), None, lambda x, y: h.scrape_tracker() ) it.tooltip_text_set( @@ -585,7 +589,7 @@ class ItemMenu(Menu): "complete peers, number of downloads etc." ) it = self.item_add( - None, "Force re-check", None, + None, _("Force re-check"), None, lambda x, y: h.force_recheck() ) it.tooltip_text_set( @@ -601,7 +605,7 @@ class ItemMenu(Menu): ) self.item_separator_add(None) it = self.item_add( - None, "Torrent properties", None, + None, _("Torrent properties"), None, self.torrent_props_cb, h ) @@ -641,18 +645,18 @@ class ItemMenu(Menu): class TorrentTooltip(Table): items = ( - ("Time when added", datetime.fromtimestamp, "added_time"), - ("Time when completed", datetime.fromtimestamp, "completed_time"), - ("All time downloaded", intrepr, "all_time_download"), - ("All time uploaded", intrepr, "all_time_upload"), - ("Total wanted done", intrepr, "total_wanted_done"), - ("Total wanted", intrepr, "total_wanted"), - ("Total downloaded this session", + (_("Time when added"), datetime.fromtimestamp, "added_time"), + (_("Time when completed"), datetime.fromtimestamp, "completed_time"), + (_("All time downloaded"), intrepr, "all_time_download"), + (_("All time uploaded"), intrepr, "all_time_upload"), + (_("Total wanted done"), intrepr, "total_wanted_done"), + (_("Total wanted"), intrepr, "total_wanted"), + (_("Total downloaded this session"), intrepr, "total_payload_download"), - ("Total uploaded this session", intrepr, "total_payload_upload"), - ("Total failed", intrepr, "total_failed_bytes"), - ("Number of seeds", None, "num_seeds"), - ("Number of peers", None, "num_peers"), + (_("Total uploaded this session"), intrepr, "total_payload_upload"), + (_("Total failed"), intrepr, "total_failed_bytes"), + (_("Number of seeds"), None, "num_seeds"), + (_("Number of peers"), None, "num_peers"), ) bold = "font_weight=Bold" @@ -671,7 +675,7 @@ class TorrentTooltip(Table): v = getattr(s, attr_name) if conv: if conv == datetime.fromtimestamp and v == 0: - v = "N/A" + v = _("N/A") else: v = conv(v) l2 = Label(self, text=str(v)) @@ -695,7 +699,7 @@ class TorrentTooltip(Table): l.text = "".join(( "<font %s>" % (self.bold), - "Pieces (scaled 1:%d)" % (g.block_size), + _("Pieces (scaled 1:%d)") % (g.block_size), "</>" )) @@ -714,7 +718,7 @@ class TorrentTooltip(Table): v = getattr(s, attr_name) if conv: if conv == datetime.fromtimestamp and v == 0: - v = "N/A" + v = _("N/A") else: v = conv(v) l.text = str(v) diff --git a/po/epour.pot b/po/epour.pot new file mode 100644 index 0000000..ade5380 --- /dev/null +++ b/po/epour.pot @@ -0,0 +1,555 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-04-22 09:05+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <[email protected]>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../epour/gui/Widgets.py:106 +msgid "Close" +msgstr "" + +#: ../epour/gui/Widgets.py:119 +msgid "OK" +msgstr "" + +#: ../epour/gui/Widgets.py:128 +msgid "Confirm exit" +msgstr "" + +#: ../epour/gui/Widgets.py:129 +msgid "Are you sure you wish to exit Epour?" +msgstr "" + +#: ../epour/gui/Widgets.py:131 +msgid "Yes" +msgstr "" + +#: ../epour/gui/Widgets.py:135 +msgid "No" +msgstr "" + +#: ../epour/gui/TorrentProps.py:87 +msgid "Enable/disable file download" +msgstr "" + +#: ../epour/gui/TorrentProps.py:121 +msgid "Invalid torrent handle." +msgstr "" + +#: ../epour/gui/TorrentProps.py:146 +msgid "Torrent info" +msgstr "" + +#: ../epour/gui/TorrentProps.py:154 +msgid "Torrent settings" +msgstr "" + +#: ../epour/gui/TorrentProps.py:162 +msgid "Torrent status" +msgstr "" + +#: ../epour/gui/TorrentProps.py:171 +msgid "Magnet URI" +msgstr "" + +#: ../epour/gui/TorrentProps.py:179 +msgid "Copy" +msgstr "" + +#: ../epour/gui/TorrentProps.py:206 +#, python-format +msgid "Epour - Files for torrent: %s" +msgstr "" + +#: ../epour/gui/TorrentProps.py:248 +msgid "Select all" +msgstr "" + +#: ../epour/gui/TorrentProps.py:252 +msgid "Select none" +msgstr "" + +#: ../epour/gui/TorrentProps.py:391 +msgid "Private" +msgstr "" + +#: ../epour/gui/TorrentProps.py:442 +msgid "Storage path" +msgstr "" + +#: ../epour/gui/TorrentProps.py:448 +msgid "Select" +msgstr "" + +#: ../epour/gui/TorrentProps.py:500 +msgid "disabled" +msgstr "" + +#: ../epour/gui/TorrentProps.py:536 ../epour/gui/__init__.py:428 +msgid "Queued" +msgstr "" + +#: ../epour/gui/TorrentProps.py:536 ../epour/gui/__init__.py:428 +msgid "Checking" +msgstr "" + +#: ../epour/gui/TorrentProps.py:536 ../epour/gui/__init__.py:428 +msgid "Downloading metadata" +msgstr "" + +#: ../epour/gui/TorrentProps.py:536 ../epour/gui/__init__.py:429 +msgid "Downloading" +msgstr "" + +#: ../epour/gui/TorrentProps.py:537 ../epour/gui/__init__.py:429 +msgid "Finished" +msgstr "" + +#: ../epour/gui/TorrentProps.py:537 ../epour/gui/__init__.py:429 +msgid "Seeding" +msgstr "" + +#: ../epour/gui/TorrentProps.py:537 ../epour/gui/__init__.py:429 +msgid "Allocating" +msgstr "" + +#: ../epour/gui/TorrentProps.py:537 ../epour/gui/__init__.py:430 +msgid "Checking resume data" +msgstr "" + +#: ../epour/gui/__init__.py:90 +msgid "Add torrent" +msgstr "" + +#: ../epour/gui/__init__.py:103 +msgid "Pause Session" +msgstr "" + +#: ../epour/gui/__init__.py:107 +msgid "Resume Session" +msgstr "" + +#: ../epour/gui/__init__.py:123 +msgid "Preferences" +msgstr "" + +#: ../epour/gui/__init__.py:126 +msgid "General" +msgstr "" + +#: ../epour/gui/__init__.py:130 +msgid "Proxy" +msgstr "" + +#: ../epour/gui/__init__.py:134 ../epour/gui/__init__.py:335 +msgid "Session" +msgstr "" + +#: ../epour/gui/__init__.py:138 +msgid "Exit" +msgstr "" + +#: ../epour/gui/__init__.py:222 +msgid "Torrent {} has finished downloading." +msgstr "" + +#: ../epour/gui/__init__.py:366 +msgid "Peer connections" +msgstr "" + +#: ../epour/gui/__init__.py:374 +msgid "Upload slots" +msgstr "" + +#: ../epour/gui/__init__.py:383 +msgid "Listening" +msgstr "" + +#: ../epour/gui/__init__.py:450 +msgid "Invalid torrent" +msgstr "" + +#: ../epour/gui/__init__.py:456 +msgid "{:.0%} complete, ETA: {} (Down: {}/s Up: {}/s Queue pos: {})" +msgstr "" + +#: ../epour/gui/__init__.py:537 +msgid "Resume" +msgstr "" + +#: ../epour/gui/__init__.py:537 +msgid "Pause" +msgstr "" + +#: ../epour/gui/__init__.py:542 +msgid "Queue" +msgstr "" + +#: ../epour/gui/__init__.py:544 +msgid "Up" +msgstr "" + +#: ../epour/gui/__init__.py:547 +msgid "Down" +msgstr "" + +#: ../epour/gui/__init__.py:550 +msgid "Top" +msgstr "" + +#: ../epour/gui/__init__.py:553 +msgid "Bottom" +msgstr "" + +#: ../epour/gui/__init__.py:556 +msgid "Remove torrent" +msgstr "" + +#: ../epour/gui/__init__.py:560 +msgid "and data files" +msgstr "" + +#: ../epour/gui/__init__.py:565 +msgid "Force reannounce" +msgstr "" + +#: ../epour/gui/__init__.py:578 +msgid "Force DHT reannounce" +msgstr "" + +#: ../epour/gui/__init__.py:582 +msgid "Scrape tracker" +msgstr "" + +#: ../epour/gui/__init__.py:592 +msgid "Force re-check" +msgstr "" + +#: ../epour/gui/__init__.py:608 +msgid "Torrent properties" +msgstr "" + +#: ../epour/gui/__init__.py:648 +msgid "Time when added" +msgstr "" + +#: ../epour/gui/__init__.py:649 +msgid "Time when completed" +msgstr "" + +#: ../epour/gui/__init__.py:650 +msgid "All time downloaded" +msgstr "" + +#: ../epour/gui/__init__.py:651 +msgid "All time uploaded" +msgstr "" + +#: ../epour/gui/__init__.py:652 +msgid "Total wanted done" +msgstr "" + +#: ../epour/gui/__init__.py:653 +msgid "Total wanted" +msgstr "" + +#: ../epour/gui/__init__.py:654 +msgid "Total downloaded this session" +msgstr "" + +#: ../epour/gui/__init__.py:656 +msgid "Total uploaded this session" +msgstr "" + +#: ../epour/gui/__init__.py:657 +msgid "Total failed" +msgstr "" + +#: ../epour/gui/__init__.py:658 +msgid "Number of seeds" +msgstr "" + +#: ../epour/gui/__init__.py:659 +msgid "Number of peers" +msgstr "" + +#: ../epour/gui/__init__.py:678 ../epour/gui/__init__.py:721 +msgid "N/A" +msgstr "" + +#: ../epour/gui/__init__.py:702 +#, python-format +msgid "Pieces (scaled 1:%d)" +msgstr "" + +#: ../epour/gui/Preferences.py:97 +msgid "Epour General Preferences" +msgstr "" + +#: ../epour/gui/Preferences.py:111 +msgid "Move completed torrents" +msgstr "" + +#: ../epour/gui/Preferences.py:119 +msgid "Completed torrents" +msgstr "" + +#: ../epour/gui/Preferences.py:148 +msgid "Delete original .torrent file when added" +msgstr "" + +#: ../epour/gui/Preferences.py:156 +msgid "Ask for confirmation on exit" +msgstr "" + +#: ../epour/gui/Preferences.py:165 +msgid "Torrents to be added from dbus or command line open a dialog" +msgstr "" + +#: ../epour/gui/Preferences.py:200 +msgid "Change path" +msgstr "" + +#: ../epour/gui/Preferences.py:237 +msgid "Listen port (range)" +msgstr "" + +#: ../epour/gui/Preferences.py:276 +msgid "Epour Proxy Preferences" +msgstr "" + +#: ../epour/gui/Preferences.py:279 +msgid "Proxy for torrent peer connections" +msgstr "" + +#: ../epour/gui/Preferences.py:281 +msgid "Proxy for torrent web seed connections" +msgstr "" + +#: ../epour/gui/Preferences.py:283 +msgid "Proxy for tracker connections" +msgstr "" + +#: ../epour/gui/Preferences.py:285 +msgid "Proxy for DHT connections" +msgstr "" + +#: ../epour/gui/Preferences.py:320 +msgid "Proxy type" +msgstr "" + +#: ../epour/gui/Preferences.py:330 +msgid "Hostname" +msgstr "" + +#: ../epour/gui/Preferences.py:341 +msgid "Port" +msgstr "" + +#: ../epour/gui/Preferences.py:349 +msgid "Username" +msgstr "" + +#: ../epour/gui/Preferences.py:360 +msgid "Password" +msgstr "" + +#: ../epour/gui/Preferences.py:372 +msgid "Proxy hostname lookups" +msgstr "" + +#: ../epour/gui/Preferences.py:381 +msgid "Proxy peer connections" +msgstr "" + +#: ../epour/gui/Preferences.py:391 ../epour/gui/Preferences.py:459 +msgid "Apply" +msgstr "" + +#: ../epour/gui/Preferences.py:410 +#, python-format +msgid "%s settings saved" +msgstr "" + +#: ../epour/gui/Preferences.py:422 +msgid "Encryption settings" +msgstr "" + +#: ../epour/gui/Preferences.py:434 +msgid "Incoming encryption" +msgstr "" + +#: ../epour/gui/Preferences.py:440 +msgid "Outgoing encryption" +msgstr "" + +#: ../epour/gui/Preferences.py:446 +msgid "Allowed encryption level" +msgstr "" + +#: ../epour/gui/Preferences.py:453 +msgid "Prefer RC4 ecryption" +msgstr "" + +#: ../epour/gui/Preferences.py:483 +msgid "Epour Session Preferences" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:61 +msgid "Seed Mode" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:64 +msgid "Share Mode" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:65 +msgid "Apply IP Filter" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:68 +msgid "Duplicate Is Error" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:71 +msgid "Super Seeding" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:72 +msgid "Sequential Download" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:73 +msgid "Use Resume Save Path" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:79 +msgid "" +"If Seed Mode is set, Epour will assume that all files are\n" +"present for this torrent and that they all match the hashes in the\n" +"torrent file. Each time a peer requests to download a block, the\n" +"piece is verified against the hash, unless it has been verified\n" +"already. If a hash fails, the torrent will automatically leave the\n" +"seed mode and recheck all the files. The use case for this mode is\n" +"if a torrent is created and seeded, or if the user already know\n" +"that the files are complete, this is a way to avoid the initial\n" +"file checks, and significantly reduce the startup time.\n" +"\n" +"Setting Seed Mode on a torrent without metadata (a .torrent\n" +"file) is a no-op and will be ignored." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:124 +#, python-format +msgid "" +"Determines if the torrent should be added in share mode or not.\n" +"Share mode indicates that we are not interested in downloading the\n" +"torrent, but merely want to improve our share ratio (i.e. increase\n" +"it). A torrent started in share mode will do its best to never\n" +"download more than it uploads to the swarm. If the swarm does not\n" +"have enough demand for upload capacity, the torrent will not\n" +"download anything. This mode is intended to be safe to add any\n" +"number of torrents to, without manual screening, without the risk\n" +"of downloading more than is uploaded.\n" +"\n" +"A torrent in share mode sets the priority to all pieces to 0,\n" +"except for the pieces that are downloaded, when pieces are decided\n" +"to be downloaded. This affects the progress bar, which might be set\n" +"to \"100% finished\" most of the time. Do not change file or piece\n" +"priorities for torrents in share mode, it will make it not work.\n" +"\n" +"The share mode has one setting, the share ratio target." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:145 +msgid "" +"Determines if the IP filter should apply to this torrent or not. By\n" +"default all torrents are subject to filtering by the IP filter\n" +"(i.e. this flag is set by default). This is useful if certain\n" +"torrents needs to be excempt for some reason, being an auto-update\n" +"torrent for instance." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:196 +msgid "" +"Sets the torrent into super seeding mode. If the torrent is not a\n" +"seed, this flag has no effect." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:202 +msgid "Sets the sequential download state for the torrent." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:207 +msgid "" +"If this flag is set, the save path from the resume data file,\n" +"if present, is honored. This defaults to not being set, in\n" +"which case the save_path specified in add_torrent_params is\n" +"always used." +msgstr "" + +#: ../epour/gui/TorrentSelector.py:217 +msgid "Add Torrent" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:243 +msgid "Enter torrent file path / magnet URI / info hash" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:252 +msgid "Select file" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:259 +msgid "Advanced Options" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:282 +msgid "Name" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:283 +msgid "Tracker ID" +msgstr "" + +#. Downloaded data is saved in this path +#: ../epour/gui/TorrentSelector.py:295 +msgid "Data Save Path" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:344 +msgid "Max Uploads" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:345 +msgid "Max Connections" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:356 +msgid "Upload Limit" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:357 +msgid "Download Limit" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:383 +msgid "Ok" +msgstr "" + +#: ../epour/gui/TorrentSelector.py:387 +msgid "Cancel" +msgstr "" --
